Answers:
您需要使用特殊的hiveconf进行变量替换。例如
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:USER}
的例子。
要查看所有可用变量,请从命令行运行
% hive -e 'set;'
或从配置单元提示符下运行
hive> set;
更新:
我也开始使用hivevar变量,将它们放入hql片段中,我可以使用source
命令从hive CLI包含这些片段(或从命令行作为-i选项传递)。这样做的好处是,该变量然后可以与或没有hivevar前缀一起使用,并允许类似于全局使用与局部使用。
因此,假设有一些setup.hql用来设置表名变量:
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'
与
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'
在CLI中,这可能并不意味着太多,但可以在使用source的文件中包含hql,但可以将某些变量“本地”设置为在脚本的其余部分中使用。
set CURRENT_DATE='2012-09-16';
,可以稍后使用${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
这里的大多数答案都建议使用hiveconf
或hivevar
命名空间来存储变量。所有这些答案都是正确的。但是,还有一个名称空间。
共有三个namespaces
可用于保存变量的变量。
因此,如果您将变量存储为查询的一部分(例如,日期或product_number),则应使用hivevar
名称空间而不是hiveconf
名称空间。
这就是它的工作方式。
hiveconf仍然是默认名称空间,因此,如果您不提供任何名称空间,它将把您的变量存储在hiveconf名称空间中。
但是,当涉及到引用变量时,事实并非如此。默认情况下,它指的是hivevar命名空间。令人困惑,对不对?通过下面的示例,它将变得更加清晰。
如果不提供如下所述的名称空间,则变量var
将存储在hiveconf
名称空间中。
set var="default_namespace";
因此,要访问此目录,您需要指定 hiveconf
名称空间
select ${hiveconf:var};
而且,如果您不提供命名空间,则会给您一个错误,如下所述,原因是默认情况下,如果您尝试访问一个变量,它将hivevar
仅在命名空间中签入。并且hivevar
其中没有名为var
select ${var};
我们已经明确提供了hivevar
命名空间
set hivevar:var="hivevar_namespace";
当我们提供命名空间时,它将起作用。
select ${hivevar:var};
并且默认情况下,在引用变量期间使用的工作空间为hivevar
,以下内容也将起作用。
select ${var};
您是否尝试过使用美元符号和方括号,如下所示:
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
两种简单的方法:
使用配置单元配置
hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';
使用配置单元变量
在CLI上设置vars,然后在配置单元中使用它们
set hivevar:USER_NAME='FOO';
hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';
文档: https : //cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
您可以在shell脚本export CURRENT_DATE =“ 2012-09-16”中导出变量
然后在hiveql中,您喜欢SELECT * FROM foo WHERE day> ='$ {env:CURRENT_DATE}'
您可以将另一个查询的输出存储在变量中,后者可以在代码中使用相同的输出:
set var=select count(*) from My_table;
${hiveconf:var};