3 回答
TA贡献2039条经验 获得超7个赞
您需要使用特殊的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和系统变量,因此您可以参考${env:USER}例如。
要查看所有可用变量,请从命令行运行
% hive -e 'set;'
或者从蜂巢提示符运行
hive> set;
更新: 我也开始使用hivevar变量,将它们放入hql片段中我可以使用source命令从hive CLI中包含(或从命令行传递-i选项)。这里的好处是,变量可以在有或没有hivevar前缀的情况下使用,并允许类似于全局和本地使用的东西。
所以,假设有一些setup.hql设置一个tablename变量:
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可能并不意味着太多,但可以在使用source的文件中使用hql ,但是在本地的其余部分中设置一些“本地”变量。
TA贡献1853条经验 获得超18个赞
这里的大多数答案都建议使用hiveconf或hivevar命名空间来存储变量。所有这些答案都是正确的。但是,还有一个命名空间。
有三个namespaces可用于保留变量。
hiveconf - hive 从此开始,所有hive配置都存储为此conf的一部分。最初,变量替换不是蜂巢的一部分,当它被引入时,所有用户定义的变量也作为其一部分存储。这绝对不是一个好主意。因此创建了两个名称空间。
hivevar:存储用户变量
system:存储系统变量。
因此,如果您将变量存储为查询的一部分(即date或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};
添加回答
举报