-hivevar和-hiveconf有什么区别?

时间:2016-06-23 16:23:39

标签: 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

5 个答案:

答案 0 :(得分:37)

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

一开始只有--hiveconf并且不存在变量替换。

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

稍后,variable substitution was added。这意味着您现在可以使用${...}语法在查询中使用变量。但是,您可以从命令行设置的唯一变量位于使用hiveconf的{​​{1}}命名空间下,因此这是用户放置变量的位置。

将您的个人变量放在Hive配置命名空间下可能不会破坏任何内容,但它也不是好形式。稍后,it was suggested为用户变量专门添加--hiveconf命名空间,也可以使用hivevar在命令行定义。这意味着Hive配置值和用户定义变量之间的分离更清晰。

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

答案 1 :(得分:9)

@Llama详细解释了这一点,并且两种类型的变量的访问方式都不同。

使用--hivevar访问${var-name}变量,而在hive中访问--hiveconf ${hiveconf:var-name}

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

<强> hivevar:

hive --hivevar a='this is a' -e '!echo ${a};'

输出:this is a

<强> hiveconf:

hive --hiveconf a='this is a' -e '!echo ${hiveconf:a};'

输出:this is a

答案 2 :(得分:0)

除命名空间外没有区别。 hiveconfhivevar是不同的名称空间。 hivevar命名空间仅添加到单独的配置属性命名空间和Hive变量命名空间。有关详细信息,请参阅https://issues.apache.org/jira/browse/HIVE-2020

答案 3 :(得分:0)

你可以参考这个差异

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution

变量有三个命名空间 - hiveconf,system和env。 (Custom variables也可以在Hive 0.8.0及更高版本中使用define或hivevar选项在单独的命名空间中创建。)

答案 4 :(得分:0)

我们还可以在脚本开头使用它们,如下所示:

hiveconf:

SET this_dt = CURRENT_DATE;
select ${hiveconf:this_dt};

蜂巢:

set hivevar:cur_dt=current_date;
select ${hivevar:cur_dt};