如何在 Hive SQL 中声明和使用变量?

Posted

技术标签:

【中文标题】如何在 Hive SQL 中声明和使用变量?【英文标题】:How to declare and use variable in Hive SQL? 【发布时间】:2020-11-16 19:22:10 【问题描述】:

我使用以下语法在 hive sql 查询中声明和使用变量。但它给了我如下错误

SET aa='10';

SELECT
col1 as data,
$aa as myVar from myTable;

错误: org.apache.hive.service.cli.HiveSQLException:处理语句时出错:无法在运行时修改 aa。它不在允许在运行时修改的参数列表中

我也尝试过使用 hiveconf

SELECT $hiveconf:aa from myTable;

【问题讨论】:

【参考方案1】:

你不能像那样传递变量。您需要使用--hivevar。您可以使用以下脚本创建一个 hql 文件 - hiveqry.hql。请注意,您可以使用普通变量或 hivevar 关键字。

select * from $hivevar:aa;
select * from $aa;

然后像下面这样调用该脚本beeline --hivevar table=myTable --hivevar aa=100 -f hiveqry.hql

【讨论】:

【参考方案2】:

根据 Hive 版本,当您在未明确指定命名空间(hiveconfhivevar)的情况下设置变量时,它可能会使用 hiveconf 作为默认命名空间或可能不起作用。

顺便说一句,这在 Hive 1.2 中有效:

SET aa='10';
SELECT $hiveconf:aa;

如果您在设置变量时明确指定命名空间,它将与 hivevar 和 hiveconf 一起使用

作品:

SET hivevar:aa='10';
SELECT $hivevar:aa;

同样有效:

SET hiveconf:aa='10';
SELECT $hiveconf:aa;

不起作用:

SET aa='10';
SELECT $hivevar:aa as myvar;

另外,如果上述命令不起作用,请检查是否启用了变量替换(默认为 true):

set hive.variable.substitute=true;

如果设置为 false,则替换不起作用。

阅读文档:LanguageManual VariableSubstitution

【讨论】:

感谢您的回复。我正在使用齐柏林飞艇。当我使用您建议的查询进行测试时: SET hivevar:aa='10';选择 $hivevar:aa;得到这个错误:java.lang.RuntimeException:无法识别动态表单类型:hivevar @DineshMadhup 阅读此问题:issues.apache.org/jira/browse/ZEPPELIN-4556 已在 0.9.0 版中解决。 "此 PR 允许用户通过段落本地属性覆盖表单类型。例如 %jdbc(form=native)" 我确实尝试过使用 %jdbc(form=native) 但仍然出现错误,例如:java.lang.RuntimeException: Could not identify dynamic form with type: hiveconf

以上是关于如何在 Hive SQL 中声明和使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在变量中获得蜂巢输出?

如何声明变量并在同一个 Oracle SQL 脚本中使用它?

DBeaver,如何声明变量并使用它们?

使用hive -f 向sql文件中传变量

运行 sql 时配置单元 UDF 如何运行?

如何使用相同的SqlConnection对象在多个SqlCommands中声明和使用T-SQL变量来执行多个插入?