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

时间:2018-12-05 03:39:29

标签: select hive set case

我遇到一个问题,我将一个值列表设置为一个变量,然后想在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查询中使用此逻辑。

任何帮助都将受到欢迎。

1 个答案:

答案 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可用于保存变量。

  1. hiveconf -hive从此开始,所有hive配置都存储为该conf的一部分。最初,变量替换不是配置单元的一部分,当它引入时,所有用户定义的变量也都作为此部分的一部分存储。这绝对不是一个好主意。因此,又创建了两个名称空间。
  2. hivevar :存储用户变量
  3. 系统:用于存储系统变量。

这就是它的工作方式。

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};