我遇到一个问题,在该问题中,我将一个值列表设置为变量,然后在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 -hive从此开始,所有hive配置都存储为该conf的一部分。最初,变量替换不是蜂巢的一部分,当它引入时,所有用户定义的变量也都作为该变量的一部分存储。这绝对不是一个好主意。因此,又创建了两个名称空间。
  • hivevar :存储用户变量
  • 系统:存储系统变量。

  • ,这就是它的工作原理。

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

    09-04 15:37
    查看更多