我遇到了一个问题,我在变量中设置了一个值列表,然后我想在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
我想知道是否有可能在配置单元查询中使用此逻辑。
欢迎任何帮助。
1条答案
按热度按时间qacovj5a1#
您以正确的方式定义变量,但是您引用的方法不正确,这就是错误的原因。您需要使用
${hiveconf:vairable_name}
试试这个详细说明:
一共有三个
namespaces
可用于保存变量。hiveconf-hive从这个开始,所有的配置都作为配置的一部分存储。最初变量替换不是配置的一部分,当它被引入时,所有用户定义的变量也作为配置的一部分存储。这绝对不是个好主意。于是又创建了两个名称空间。
hivevar:存储用户变量
系统:存储系统变量。
这就是它的工作原理。
hiveconf仍然是默认的名称空间,因此如果不提供任何名称空间,它将把变量存储在hiveconf名称空间中。
然而,当提到一个变量时,这不是真的。默认情况下,它引用hivevar名称空间。很困惑,对吧?下面的例子会更清楚。
未提供命名空间,变量
var
将存储在hiveconf
命名空间。这会起作用的,正如你所说的
hiveconf
命名空间这将给您带来错误,因为如果没有提供名称空间,它将签入
hivevar
命名空间。而且在hivevar
没有名为的变量var
```select ${var};
set hivevar:var="hivevar_namespace";
select ${hivevar:var};
select ${var};