为了账号安全,请及时绑定邮箱和手机立即绑定

如何在HIVE脚本中设置变量

如何在HIVE脚本中设置变量

我正在寻找SET varname = valueHive QL中的SQL等价物我知道我可以这样做:SET CURRENT_DATE = '2012-09-16';SELECT * FROM foo WHERE day >= @CURRENT_DATE但后来我得到了这个错误:这里不支持字符'@'
查看完整描述

3 回答

?
largeQ

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 ,但是在本地的其余部分中设置一些“本地”变量。


查看完整回答
反对 回复 2019-09-19
?
慕容森

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};


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 3492 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信