我遇到一个问题,我将一个值列表设置为一个变量,然后想在SELECT语句的CASE语句中使用该列表,但由于某种原因,我一直遇到错误。
编译语句时出错:失败:ParseException第3:38行无法识别表达式规范中'IN''THEN''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
我想知道是否有可能在HIVE查询中使用此逻辑。
任何帮助都将受到欢迎。
答案 0 :(得分:5)
您以正确的方式定义了变量,但是您所引用的变量不正确,这就是错误的原因。您需要使用${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 仍然是默认名称空间,因此,如果您不提供任何名称空间,它将在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};