-hivevar 和 -hiveconf 之间有什么区别?

What is the difference between -hivevar and -hiveconf?

来自 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

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

你可以参考这里的区别

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

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

我不太觉得文档中的示例是足够的,所以这是我尝试的答案。

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

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

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

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

总结:
hiveconf 命名空间和 --hiveconf 应该用于设置 Hive 配置值。
hivevar 命名空间和 --hivevar 应该用于定义用户变量。
hiveconf 命名空间下设置用户变量可能不会破坏任何东西,但不推荐这样做。

@Llama 解释的很详细,而且这两种变量的访问方式不同。

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

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

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

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

hiveconf:

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

hivevar:

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