我遇到一个问题,在该问题中,我将一个值列表设置为变量,然后在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查询中使用此逻辑。
任何帮助都将受到欢迎。
最佳答案
您以正确的方式定义了变量,但是您引用的它们不正确,这就是错误的原因。您需要使用${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};