如何在HIVE脚本中设置variables

我正在寻找Hive QL中“SET varname = value”的SQL等价物

我知道我可以做这样的事情:

SET CURRENT_DATE = '2012-09-16'; SELECT * FROM foo WHERE day >= @CURRENT_DATE 

但后来我得到这个错误“字符”@“不支持在这里”

您需要使用特殊的hiveconf进行variablesreplace。 例如

 hive> set CURRENT_DATE='2012-09-16'; hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}' 

同样,你可以传递命令行:

 % hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql 

请注意,还有env系统variables,因此您可以参考${env:USER}

要查看所有可用的variables,请从命令行运行

 % hive -e 'set;' 

或者从configuration单元提示符运行

 hive> set; 

更新:我也开始使用hivevarvariables,把它们放入我可以使用source命令从hive CLI中包含的hql片段(或者从命令行传递为-i选项)。 这样做的好处是variables可以使用或不使用hivevar前缀,并允许类似于全局和本地使用的东西。

所以,假设有一些setup.hql设置了一个tablenamevariables:

 set hivevar:tablename=mytable; 

那么,我可以进入蜂巢:

 hive> source /path/to/setup.hql; 

并在查询中使用:

 hive> select * from ${tablename} 

要么

 hive> select * from ${hivevar:tablename} 

我也可以设置一个“本地”表名,这会影响到$ {tablename}的使用,但不能使用$ {hivevar:tablename}

 hive> set tablename=newtable; hive> select * from ${tablename} -- uses 'newtable' 

VS

 hive> select * from ${hivevar:tablename} -- still uses the original 'mytable' 

在CLI中可能并不意味着太多,但是可以在使用源代码的文件中包含hql,但是可以在脚本的其余部分中设置一些“本地”variables。

你有没有尝试过使用美元符号括号这样的:

 SELECT * FROM foo WHERE day >= '${CURRENT_DATE}'; 

您可以将另一个查询的输出存储在variables中,后者可以在代码中使用相同的查询:

 set var=select count(*) from My_table; ${hiveconf:var};