我有两个表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。
答案 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支持IN
,NOT IN
,EXIST
和NOT EXISTS
。
select count(*)
from flight a
where not exists(select b.tailnum from plane b where b.tailnum = a.tailnum);
EXIST
和NOT 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