我想使用变量替换在配置单元中创建一个表名。例如
SET market = "AUS"; create table ${hiveconf:market_cd}_active as ... ;
但它失败了。你知道怎样才能做到吗?
bqjvbblv1#
应取消资格您使用了错误的变量名
SET market=AUS; create table ${hiveconf:market}_active as select 1;
mbjcgjjk2#
您应该使用backtrics(``)作为名称,例如:
SET market=AUS; CREATE TABLE `${hiveconf:market}_active` AS SELECT 1; DESCRIBE `${hiveconf:market}_active`;
从beeline运行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/
bcs8qyzn3#
马尔科维茨的批评是正确的,但没有产生一个正确的解决办法。总之,可以使用变量替换来进行字符串比较,但不能用于命名变量和表。如果你对语言编译器和解析器了解很多,你就会明白为什么这是真的。你可以用java这样的语言来构造这样的行为,但是sql太粗糙了。运行该代码会产生一个错误,“无法识别表名中'$'{''hiveconf'附近的输入”。(我正在运行hortonworks,hive 1.2.1000.2.5.3.0-37)。我花了几个小时在google上搜索和试验标点符号的不同组合,以及命令行、ambari和db visualizer等各种工具,但我从未找到任何方法来构造具有可变值的表名或字段名。我认为在需要字符串文字的地方使用变量是很困难的,比如比较,但是如果有意义的话,就不能用它们来代替保留字或现有的数据结构。举例来说:--作品删除表(如果存在)用户\u rgksp0.foo;--不起作用:设置myu file\u name=user\u rgksp0.foo--删除表(如果存在)${hiveconf:my_file_name};--作品设置报告年=2018年;从aaetl\u dms\u pub.dms\u stational\u events\u pub中选择count(1)作为stational\u event\u count、day、zip\u code、route\u id其中第${hiveconf:report_year}'--不起作用:设置我的\u var\u name='zip\u code'选择“计数(1)”作为“事件计数,天”${hiveconf:my_var_name}'的路由id,来自aaetl\u dms\u pub.dms\u stational\u events\u pub其中part_year=2018年
3条答案
按热度按时间bqjvbblv1#
应取消资格
您使用了错误的变量名
mbjcgjjk2#
您应该使用backtrics(``)作为名称,例如:
从beeline运行script.sql的示例:
bcs8qyzn3#
马尔科维茨的批评是正确的,但没有产生一个正确的解决办法。总之,可以使用变量替换来进行字符串比较,但不能用于命名变量和表。如果你对语言编译器和解析器了解很多,你就会明白为什么这是真的。你可以用java这样的语言来构造这样的行为,但是sql太粗糙了。
运行该代码会产生一个错误,“无法识别表名中'$'{''hiveconf'附近的输入”。(我正在运行hortonworks,hive 1.2.1000.2.5.3.0-37)。
我花了几个小时在google上搜索和试验标点符号的不同组合,以及命令行、ambari和db visualizer等各种工具,但我从未找到任何方法来构造具有可变值的表名或字段名。我认为在需要字符串文字的地方使用变量是很困难的,比如比较,但是如果有意义的话,就不能用它们来代替保留字或现有的数据结构。举例来说:
--作品
删除表(如果存在)用户\u rgksp0.foo;
--不起作用:
设置myu file\u name=user\u rgksp0.foo--删除表(如果存在)${hiveconf:my_file_name};
--作品
设置报告年=2018年;
从aaetl\u dms\u pub.dms\u stational\u events\u pub中选择count(1)作为stational\u event\u count、day、zip\u code、route\u id
其中第${hiveconf:report_year}'
--不起作用:
设置我的\u var\u name='zip\u code'
选择“计数(1)”作为“事件计数,天”${hiveconf:my_var_name}'的路由id,来自aaetl\u dms\u pub.dms\u stational\u events\u pub
其中part_year=2018年