-hivevar和-hiveconf有什么区别?

Kar*_*rod 23 hadoop hive hiveql

来自hive -h:

--hiveconf <property=value>   Use value for given property
--hivevar <key=value>         Variable subsitution to apply to hive
                                  commands. e.g. --hivevar A=B
Run Code Online (Sandbox Code Playgroud)

Mr.*_*ama 42

我觉得文档中的例子不够充分,所以这是我尝试回答的问题.

在一开始只有--hiveconf和变量替换不存在.

--hiveconf选项允许用户从命令行设置Hive配置值,就是这样.所有Hive配置值都存储在hiveconf命名空间下,即hiveconf:mapred.reduce.tasks.这些值允许您控制映射器和缩减器的数量,如果应显示状态消息,以及脚本是否应继续出错.

后来,增加了变量替换.这意味着您现在可以使用${...}语法在查询中使用变量.但是,您可以从命令行设置的唯一变量是在hiveconf命名空间下使用--hiveconf,因此这是用户放置变量的位置.

将您的个人变量放在Hive配置命名空间下可能不会破坏任何内容,但它也不是好形式.后来,有人建议hivevar为用户变量添加一个名称空间,也可以在命令行中使用--hivevar.这意味着Hive配置值和用户定义变量之间的清晰分离.

总结:
hiveconf命名空间和--hiveconf应该用来设置蜂巢配置值.
hivevar命名空间,--hivevar应该被用来定义用户变量.
hiveconf命名空间下设置用户变量可能不会破坏任何内容,但不建议这样做.

  • 我想你可能有,但我决定为未来的读者提交另一个答案,以防万一.=] (4认同)

Rah*_*rma 9

@Llama详细解释了它,并且两种类型的变量的访问方式不同.

--hivevar变量是使用访问${var-name},而--hiveconf被访问${hiveconf:var-name}内部蜂巢.

例如,下面的示例访问变量并在配置单元中打印它的值.

hivevar:

hive --hivevar a='this is a' -e '!echo ${a};'
Run Code Online (Sandbox Code Playgroud)

输出:this is a

hiveconf:

hive --hiveconf a='this is a' -e '!echo ${hiveconf:a};'
Run Code Online (Sandbox Code Playgroud)

输出:this is a


小智 5

我们还可以在脚本的开头使用它们:

配置单元配置:

SET this_dt = CURRENT_DATE;
select ${hiveconf:this_dt};
Run Code Online (Sandbox Code Playgroud)

蜂巢变量:

set hivevar:cur_dt=current_date;
select ${hivevar:cur_dt};
Run Code Online (Sandbox Code Playgroud)