为什么Hive查询不支持IN / EXIST运算符?

时间:2013-06-07 12:13:20

标签: sql hadoop hive

我看一下Hive Language Manual

并认识到Hive查询不支持IN / EXIST运算符,他们建议使用LEFT SEMI JOIN作为替代。你知道原因吗?

3 个答案:

答案 0 :(得分:3)

Hive支持in / exists运算符,但不支持in中的子查询。

作为替代方案,您可以使用左半连接。

Hive

中无法实现
SELECT a.key, a.value
  FROM a
  WHERE a.key in
   (SELECT b.key
    FROM B);

以上可以使用左半连接重写。

SELECT a.key, a.val
   FROM a LEFT SEMI JOIN b on (a.key = b.key)

check this

答案 1 :(得分:3)

这让我想起了Eric Lippert所提出的问题“为什么C#没有Java功能X?”人们不会通过从另一个语言开始并删除内容来构建语言,而是从零开始并决定要实现哪些功能。

在某些时候,hive既不支持IN \ EXISTS子查询,也不支持LEFT SEMI JOIN。然后,有人suggested they add LEFT SEMI JOIN。现在,这是在语言中,它消除了实现IN \ EXISTS子查询的一些原因,因为两者在语义上是等价的。

答案 2 :(得分:0)

FWIW,Hive似乎支持IN运营商:

=IF( NOT( ISERROR( MATCH(200,RentLogs[Item ID],0) ) ), INDEX(RentLogs[Check In Date], MATCH(200,RentLogs[Item ID],0) ), 200 & " not found in RentLog" )

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF