Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 如何在配置单元脚本中设置变量_Hive_Hiveql - Fatal编程技术网

Hive 如何在配置单元脚本中设置变量

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

我正在寻找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。 e、 g

类似地,您可以在命令行上传递:

% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql
请注意,还有envsystem变量,因此您可以引用
${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";
总共有三个
名称空间
可用于保存变量。

  • hiveconf-配置单元以此开始,所有配置单元配置都存储在此配置中。最初,变量替换不是配置单元的一部分,引入时,所有用户定义的变量也存储在此配置中。这绝对不是个好主意。于是又创建了两个名称空间
  • hivevar:存储用户变量
  • 系统:存储系统变量 因此,如果要将变量存储为查询的一部分(即日期或产品编号),则应使用
    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}
    在同时运行多个配置单元作业的情况下,这是如何工作的?他们最终会从对方那里获取价值吗?在自动化领域