Hive 如何在配置单元脚本中设置变量
我正在寻找HiveQL中的SQL等价物Hive 如何在配置单元脚本中设置变量,hive,hiveql,Hive,Hiveql,我正在寻找HiveQL中的SQL等价物setvarname=value 我知道我可以做这样的事情: SET CURRENT_DATE = '2012-09-16'; SELECT * FROM foo WHERE day >= @CURRENT_DATE 但是我得到了这个错误: 此处不支持字符“@” 您是否尝试过使用美元符号和括号: SELECT * FROM foo WHERE day >= '${CURRENT_DATE}'; 对于变量替换,需要使用特殊的hiveconf
setvarname=value
我知道我可以做这样的事情:
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
但是我得到了这个错误:
此处不支持字符“@”
您是否尝试过使用美元符号和括号:
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
对于变量替换,需要使用特殊的hiveconf。 e、 g 类似地,您可以在命令行上传递:
% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql
请注意,还有env和system变量,因此您可以引用${env:USER}
要查看所有可用变量,请从命令行运行
% hive -e 'set;'
或者在配置单元提示符下,运行
hive> set;
更新:
我也开始使用hivevar变量,使用source
命令(或命令行中的pass as-I选项)将它们放入hql代码片段中,我可以从HiveCLI中包括这些代码片段。
这里的好处是,该变量可以使用hivevar前缀,也可以不使用hivevar前缀,并允许类似于全局和本地使用的东西
因此,假设您有一些setup.hql,它设置一个tablename变量:
set hivevar:tablename=mytable;
然后,我可以带进蜂箱:
hive> source /path/to/setup.hql;
并在查询中使用:
hive> select * from ${tablename}
或
我还可以设置一个“本地”表名,这将影响${tablename}的使用,但不会影响${hivevar:tablename}
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'
vs
可能对CLI没有太大意义,但可以在使用源代码的文件中使用hql,但可以将一些变量“本地”设置为在脚本的其余部分中使用。您可以将另一个查询的输出存储在变量中,后者可以在代码中使用相同的变量:
set var=select count(*) from My_table;
${hiveconf:var};
尝试以下方法:
set t=20;
select *
from myTable
where age > '${hiveconf:t}';
它在我的平台上运行良好。两种简单的方法:
使用配置单元配置
hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';
使用蜂箱变量
在CLI上设置变量,然后在配置单元中使用它们
set hivevar:USER_NAME='FOO';
hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';
文档:这里的大多数答案都建议使用
hiveconf
或hivevar
名称空间来存储变量。所有这些答案都是正确的。但是,还有一个名称空间
set var="default_namespace";
总共有三个名称空间
可用于保存变量。
hivevar
名称空间,而不是hiveconf
名称空间
set var="default_namespace";
这就是它的工作原理。
hiveconf仍然是默认名称空间,因此如果不提供任何名称空间,它将把变量存储在hiveconf名称空间中
set var="default_namespace";
然而,当提到一个变量时,它不是真的。默认情况下,它引用hivevar名称空间。令人困惑,对吧?通过下面的例子可以变得更清楚
如果您不提供下面提到的命名空间,变量var将存储在hiveconf
命名空间中
set var="default_namespace";
因此,要访问它,您需要指定hiveconf
名称空间
select ${hiveconf:var};
set hivevar:var="hivevar_namespace";
如果您不提供名称空间,它将给您一个如下所述的错误,原因是默认情况下,如果您尝试访问一个变量,它将只在hivevar
名称空间中进行检查。在hivevar
中没有名为var
select ${var};
我们明确提供了hivevar
名称空间
select ${hiveconf:var};
set hivevar:var="hivevar_namespace";
当我们提供名称空间时,这将起作用
select ${hivevar:var};
默认情况下,引用变量时使用的工作区是hivevar
,以下内容也适用
select ${var};
需要注意的一件事是设置字符串,然后再引用它们。你必须确保引文没有冲突
set start_date = '2019-01-21';
select ${hiveconf:start_date};
设置日期时,在代码中引用日期,因为字符串可能会冲突。这在上面设置的开始日期下不起作用
'${hiveconf:start_date}'
在查询中引用字符串时,我们必须注意不要为字符串设置两次单引号或双引号。您可以在shell脚本中导出变量 导出当前日期=“2012-09-16” 那么在hiveql中你喜欢什么
选择*FROM foo WHERE day>='${env:CURRENT_DATE}'以防有人需要通过cli参数化配置单元查询 例如: hive_query.sql
SELECT * FROM foo WHERE day >= '${hivevar:CURRENT_DATE}'
现在从cli执行上述sql文件:
hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql
在配置单元中设置变量有多个选项 如果要从配置单元外壳内部设置配置单元变量,可以使用
hivevar
进行设置。您可以设置字符串或整数数据类型。他们没有问题
设置hivevar:which_date=20200808;
选择${which_date};
如果您计划从shell脚本设置变量,并希望将这些变量传递到配置单元脚本(HQL)文件中,则可以在调用配置单元或直线命令时使用--hivevar
选项
#shell脚本将像这样调用脚本
beeline--hivevar tablename=testtable-f select.hql
--选择.hql文件
从${tablename}中选择*;
这是从命令行传递参数,我正在Karmasphere中开发查询,需要在begging中设置一些contant,这样我就不会在脚本中硬编码10次日期。这样做可能吗?如果您设置当前日期为2012-09-16,则双向工作您可以稍后使用${hiveconf:CURRENT_DATE}
在同时运行多个配置单元作业的情况下,这是如何工作的?他们最终会从对方那里获取价值吗?在自动化领域