11

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

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

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

我想到了以下

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

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

4

4 回答 4

26

You can do the same with a LEFT OUTER JOIN in Hive:

SELECT A.id
FROM A
LEFT OUTER JOIN B
ON (B.id = A.id)
WHERE B.id IS null
于 2013-05-29T03:06:17.867 回答
6

Hive 似乎从 0.13开始支持INNOT IN和。EXISTNOT 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 > WHERE 子句中的子查询

于 2015-02-05T01:02:09.773 回答
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)
于 2013-05-29T17:06:53.187 回答
1

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

例如: SELECT A.id FROM A left anti join B on a.id=b.id

于 2019-03-05T12:56:04.680 回答