关于Hive中case when不准使用子查询的解决方法

Posted harrylyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Hive中case when不准使用子查询的解决方法相关的知识,希望对你有一定的参考价值。

在公司用Hive实现个规则的时候,遇到了要查询某个字段是否在另一张表中,大概情况就是

A表:

id value1 value2
1 100 0
2 101 1
3 102 1

B表:

value1
100
102
104

我要查询A表中当value2为0的时候直接输出0,为1的时候,判断value1是否在B表的value1中,如果在那么便输出0,不在便输出1,拿到第一反映是:

select 
case
when value2 = 0 then 0
when value2 = 1 then
    case
    when value1 in (select value1 from B) then 0
    else 1
    end
end as value3
from A 

结果Hive就报错了

Error: Error while compiling statement: FAILED: SemanticException Line 0:-1 Unsupported SubQuery Expression ‘value1‘: Currently SubQuery expressions are only allowed as Where Clause predicates.

大概意思就是:目前的子查询表达式只允许为Where条件谓词

于是我们就必须将其改为使用left join来解决。

select
case 
when a.value2 = 0 then 0
when a.value2 = 1 then 
    case when
    b.value1 is not null then 0
    else 1
    END
END as value3 
from A a
left join 
B b
on a.value1 = b.value1;

大功告成,对了,使用的Hive版本为1.1.0

以上是关于关于Hive中case when不准使用子查询的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

从 CASE WHEN 语句中取出相关子查询

Hive中case when的两种语法

子查询作为 CASE WHEN 条件

Hive SQL 逻辑 - case when 语句

TSQL:SELECT CASE WHEN THEN 子查询:错误:子查询返回超过 1 个值

使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式