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

标签 select hive set case

我遇到一个问题,我将一个值列表设置到一个变量中,然后我想在我的 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

详细说明:

共有三个命名空间可用于保存变量。

  1. hiveconf - hive 以此开始,所有 hive 配置都作为此 conf 的一部分存储。最初变量替换不是配置单元的一部分,当它被引入时,所有用户定义的变量也作为它的一部分存储。这绝对不是一个好主意。因此又创建了两个命名空间。
  2. hivevar:存储用户变量
  3. 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/

相关文章:

hadoop - 如何使用PIG/HIVE/HBASE从文件动态加载没有文本限定符的数据?

java - Hive 在创建表 "Cannot validate serde: com.cloudera.hive.serde.JSONSerDe"时抛出错误

java - 披萨课。添加一个名为 setOfToppings 的集合作为属性。使用Java

java - 如何添加到基于 Java 中特定谓词的集合?

mysql - GROUP BY 也选择非常量列

SQL:如何找到从一个表链接到另一个表的最小条目数

MySql - 在查询中使用左外连接进行连接

apache-spark - Spark Connect Hive 到 HDFS vs Spark 直接连接 HDFS 和 Hive 在它上面?

c++ - 使用 set 检测重复项

sql - 通过在 Big Query 中插入日期记录来填充数据