如何在配置单元中的case语句中使用set list变量

jljoyd4f  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(347)

我遇到了一个问题,我在变量中设置了一个值列表,然后我想在select语句中的case语句中使用这个列表,但是由于某些原因,我不断地得到一个错误。
编译语句时出错:失败:parseexception行3:38无法识别表达式规范中“in”和“c”附近的输入
例如

SET close=('a','b','c');
SET open=('x','y','z');
SELECT *,
      CASE 
      WHEN test IN ${close} then 'c'
      WHEN test IN ${open} then 'o' 
      END as case
FROM t1

我想知道是否有可能在配置单元查询中使用此逻辑。
欢迎任何帮助。

qacovj5a

qacovj5a1#

您以正确的方式定义变量,但是您引用的方法不正确,这就是错误的原因。您需要使用 ${hiveconf:vairable_name} 试试这个

SET close=('a','b','c');
SET open=('x','y','z');
SELECT *,
      CASE 
      WHEN test IN ${hiveconf:close} then 'c'
      WHEN test IN ${hiveconf:open} then 'o' 
      END as case
FROM t1

详细说明:
一共有三个 namespaces 可用于保存变量。
hiveconf-hive从这个开始,所有的配置都作为配置的一部分存储。最初变量替换不是配置的一部分,当它被引入时,所有用户定义的变量也作为配置的一部分存储。这绝对不是个好主意。于是又创建了两个名称空间。
hivevar:存储用户变量
系统:存储系统变量。
这就是它的工作原理。
hiveconf仍然是默认的名称空间,因此如果不提供任何名称空间,它将把变量存储在hiveconf名称空间中。
然而,当提到一个变量时,这不是真的。默认情况下,它引用hivevar名称空间。很困惑,对吧?下面的例子会更清楚。
未提供命名空间,变量 var 将存储在 hiveconf 命名空间。

set var="default_namespace";

这会起作用的,正如你所说的 hiveconf 命名空间

select ${hiveconf:var};

这将给您带来错误,因为如果没有提供名称空间,它将签入 hivevar 命名空间。而且在 hivevar 没有名为的变量 var ```
select ${var};

我们明确规定 `hivevar` 命名空间

set hivevar:var="hivevar_namespace";

当我们提供名称空间时,这将起作用。

select ${hivevar:var};

引用变量时使用的默认工作区是 `hivevar` ,以下也可以。

select ${var};

相关问题