Hive不支持,存在。如何编写以下查询?

时间:2013-05-29 02:13:27

标签: hadoop hive hiveql

我有两个表A和B都有一个列id。我希望从A中获得不存在于B中的ID。显而易见的方法是:

SELECT id FROM A WHERE id NOT IN (SELECT id FROM B)

不幸的是,Hive不支持in,exists或子查询。有没有办法使用连接来实现上述目的?

我想到了以下

SELECT A.id FROM A,B WHERE A.id<>B.id

但似乎这将返回整个A,因为B中始终存在一个不等于A中任何id的id。

4 个答案:

答案 0 :(得分:24)

您可以对Hive中的LEFT OUTER JOIN执行相同的操作:

SELECT A.id
FROM A
LEFT OUTER JOIN B
ON (B.id = A.id)
WHERE B.id IS null

答案 1 :(得分:5)

Hive似乎从0.13支持INNOT INEXISTNOT EXISTS

select count(*)
from flight a
where not exists(select b.tailnum from plane b where b.tailnum = a.tailnum);

EXISTNOT EXISTS中的子查询应该具有相关谓词(如上例中的b.tailnum = a.tailnum) 有关更多信息,请参阅Hive Wiki > Subqueries in the WHERE Clause

答案 2 :(得分:3)

你是否想要IN这样做:

SELECT id FROM A WHERE id IN (SELECT id FROM B)

Hive的内容为LEFT SEMI JOIN

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

答案 3 :(得分:1)

如果可以使用spark sql,则可以使用左反连接。

ex:在a.id = b.id上从A左反连接B中选择A.id