我遇到一个问题,我将一个值列表设置到一个变量中,然后我想在我的 CASE 语句中的 SELECT 语句中使用该列表,但由于某种原因,我不断收到错误。
Error while compiling statement: FAILED: ParseException line 3:38 cannot recognize input near 'IN' 'THEN' ''C'' in expression specification
例如
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
详细说明:
共有三个命名空间
可用于保存变量。
- hiveconf - hive 以此开始,所有 hive 配置都作为此 conf 的一部分存储。最初变量替换不是配置单元的一部分,当它被引入时,所有用户定义的变量也作为它的一部分存储。这绝对不是一个好主意。因此又创建了两个命名空间。
- hivevar:存储用户变量
- system:存放系统变量。
这就是它的工作原理。
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};
关于select - 如何在 HIVE 的 CASE 语句中使用 SET 列表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53624828/