我正在寻找与Hive QL中的SET varname = value
等价的SQL
我知道我可以这样做:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
但是我得到了这个错误:
此处不支持
字符'@‘
发布于 2012-09-19 06:03:30
您需要使用特殊的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
命令(或从命令行作为-i选项传递)从hive CLI包含它们。这里的好处是,变量可以与hivevar前缀一起使用,也可以不与hivevar前缀一起使用,并允许类似于全局与本地使用。
因此,假设有一些setup.hql设置了一个tablename变量:
set hivevar:tablename=mytable;
然后,我可以将其带入蜂巢:
hive> source /path/to/setup.hql;
并在查询中使用:
hive> select * from ${tablename}
或
hive> select * from ${hivevar:tablename}
我还可以设置一个"local“表名,这会影响${ 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-01-04 10:26:29
这里的大多数答案都建议使用hiveconf
或hivevar
名称空间来存储变量。所有这些答案都是正确的。但是,还有一个名称空间。
总共有三种 namespaces
可用于保存变量。
因此,如果您将变量存储为查询的一部分(即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};
发布于 2012-09-18 02:41:11
您是否尝试过像这样使用美元符号和括号:
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
https://stackoverflow.com/questions/12464636
复制相似问题