来自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
答案 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)
除命名空间外没有区别。 hiveconf
和hivevar
是不同的名称空间。 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};