-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
除了名称空间外没有区别。 hiveconf
和 hivevar
是不同的命名空间。 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。这意味着您现在可以使用 ${...}
语法在查询中使用变量。但是,您可以从命令行设置的唯一变量是在使用 --hiveconf
的 hiveconf
命名空间下,因此这是用户放置变量的地方。
将您的个人变量放在 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};
来自 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
除了名称空间外没有区别。 hiveconf
和 hivevar
是不同的命名空间。 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。这意味着您现在可以使用 ${...}
语法在查询中使用变量。但是,您可以从命令行设置的唯一变量是在使用 --hiveconf
的 hiveconf
命名空间下,因此这是用户放置变量的地方。
将您的个人变量放在 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};