猿问

如何在HIVE脚本中设置变量

我正在寻找SET varname = valueHive QL中的SQL等价物


我知道我可以这样做:


SET CURRENT_DATE = '2012-09-16';

SELECT * FROM foo WHERE day >= @CURRENT_DATE

但后来我得到了这个错误:


这里不支持字符'@'


桃花长相依
浏览 3493回答 3
3回答

largeQ

您需要使用特殊的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'VShive> select * from ${hivevar:tablename} -- still uses the original 'mytable'从CLI可能并不意味着太多,但可以在使用source的文件中使用hql ,但是在本地的其余部分中设置一些“本地”变量。

慕容森

这里的大多数答案都建议使用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没有名为变量的变量varselect ${var}; 我们已明确提供hivevar名称空间set hivevar:var="hivevar_namespace";因为我们提供命名空间,这将起作用。select ${hivevar:var}; 默认情况下,在引用变量时使用的工作空间hivevar也是如此。select ${var};
随时随地看视频慕课网APP
我要回答