如何在HIVE中的CASE语句中使用SET列表变量

Zla*_*tko 2 select hive case set

我遇到一个问题,我将一个值列表设置为一个变量,然后我想在SELECT语句中的CASE语句中使用该列表,但由于某种原因,我继续收到错误.

编译语句时出错:FAILED: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
Run Code Online (Sandbox Code Playgroud)

我想知道是否甚至可以在HIVE查询中使用此逻辑.

欢迎任何帮助.

Gau*_*hah 6

你正在以正确的方式定义变量,但是我们你所指的是不正确的,这就是错误的原因.你需要使用引用变量${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
Run Code Online (Sandbox Code Playgroud)

长说明:

有三个namespaces可用于保留变量.

  1. hiveconf - hive 从此开始,所有hive配置都存储为此conf的一部分.最初变量替换不是蜂巢的一部分,当它被引入时,所有用户定义的变量也作为其一部分存储.这肯定不是一个好主意.因此创建了两个以上的命名空间.
  2. hivevar:存储用户变量
  3. system:存储系统变量.

这就是它的工作原理.

hiveconf仍然是默认命名空间,因此如果您不提供任何命名空间,它会将您的变量存储在hiveconf命名空间中.

但是,当涉及引用变量时,情况并非如此.默认情况下,它指的是hivevar名称空间.令人困惑,对吧?从下面的例子可以更清楚.

没有提供名称空间,变量var将存储在hiveconf名称空间中.

set var="default_namespace";
Run Code Online (Sandbox Code Playgroud)

这将起作用,因为您已指定hiveconf名称空间

select ${hiveconf:var};
Run Code Online (Sandbox Code Playgroud)

如果没有提供命名空间,它会检查hivevar命名空间,这会给你错误.并且hivevar没有名称变量var

select ${var}; 
Run Code Online (Sandbox Code Playgroud)

我们已明确提供hivevar名称空间

set hivevar:var="hivevar_namespace";
Run Code Online (Sandbox Code Playgroud)

因为我们提供命名空间,这将起作用.

select ${hivevar:var}; 
Run Code Online (Sandbox Code Playgroud)

并且作为在引用变量期间使用的默认工作空间hivevar,以下也将起作用.

select ${var};
Run Code Online (Sandbox Code Playgroud)