我想使用变量替换在Hive中创建表名。 E.g。
SET market = "AUS";
create table ${hiveconf:market_cd}_active as ... ;
但它失败了。知道如何实现它吗?
答案 0 :(得分:0)
SET market=AUS; create table ${hiveconf:market}_active as select 1;
答案 1 :(得分:0)
马尔科维茨的批评是正确的,但没有提出正确的解决方案。总之,可以将变量替换用于字符串比较之类的操作,但不能用于变量和表的命名之类的操作。如果您对语言编译器和解析器了解很多,那么您就会了解为什么这是正确的。您可以使用Java之类的语言来构造这种行为,但是SQL太粗糙了。
运行该代码会产生错误,“无法识别表名中'$''{''hiveconf'附近的输入”。(我正在运行Hortonworks,Hive 1.2.1000.2.5.3.0-37)。
我花了几个小时在Google上进行搜索,并尝试使用标点符号的不同组合,命令行,Ambari和DB Visualizer等不同的工具,但我从未找到用表名或字段名构建表的方法。可变值。我认为您一直在需要字符串文字的地方使用变量,例如比较,但是如果可以的话,您不能在保留字或现有数据结构的地方使用变量。例如:
-工作
删除表(如果存在)user_rgksp0.foo;
-不起作用:
设置MY_FILE_NAME = user_rgksp0.foo; --drop表是否存在$ {hiveconf:MY_FILE_NAME};
-有效
设置REPORT_YEAR = 2018;
从aaetl_dms_pub.dms_stationary_events_pub中选择count(1)作为static_event_count,日期,邮政编码,route_id
其中part_year ='$ {hiveconf:REPORT_YEAR}'
-不起作用:
设置MY_VAR_NAME =“邮政编码”
从aaetl_dms_pub.dms_stationary_events_pub中选择count(1)作为“ static_event_count”,“ day”,“ $ {hiveconf:MY_VAR_NAME}”,route_id
其中part_year = 2018
答案 2 :(得分:0)
您应该使用backtric(``)作为名称,例如:
SET market=AUS;
CREATE TABLE `${hiveconf:market}_active` AS SELECT 1;
DESCRIBE `${hiveconf:market}_active`;
示例从直线上运行script.sql:
$ beeline -u jdbc:hive2://localhost:10000/ -n hadoop -f script.sql
Connecting to jdbc:hive2://localhost:10000/
...
0: jdbc:hive2://localhost:10000/> SET market=AUS;
No rows affected (0.057 seconds)
0: jdbc:hive2://localhost:10000/> CREATE TABLE `${hiveconf:market}_active` AS SELECT 1;
...
INFO : Dag name: CREATE TABLE `AUS_active` AS SELECT 1(Stage-1)
...
INFO : OK
No rows affected (12.402 seconds)
0: jdbc:hive2://localhost:10000/> DESCRIBE `${hiveconf:market}_active`;
...
INFO : Executing command(queryId=hive_20190801194250_1a57e6ec-25e7-474d-b31d-24026f171089): DESCRIBE `AUS_active`
...
INFO : OK
+-----------+------------+----------+
| col_name | data_type | comment |
+-----------+------------+----------+
| _c0 | int | |
+-----------+------------+----------+
1 row selected (0.132 seconds)
0: jdbc:hive2://localhost:10000/> Closing: 0: jdbc:hive2://localhost:10000/