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

qojgxg4l  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(457)

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

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

不幸的是,配置单元不支持in、exists或子查询。有没有一种方法可以通过连接实现上述功能?
我想到了以下几点

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

但这似乎会返回整个a,因为b中总是存在一个id,它不等于a中的任何id。

iqjalb3h

iqjalb3h1#

你想做一个 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)
zbsbpyhn

zbsbpyhn2#

Hive似乎支持 IN , NOT IN , EXIST 以及 NOT EXISTS 从0.13开始。

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

中的子查询 EXIST 以及 NOT EXISTS 应该有相关的 predicate (比如 b.tailnum = a.tailnum 在上面的示例中)有关更多信息,请参阅where子句中的hivewiki>subquerys

cnjp1d6j

cnjp1d6j3#

如果可以使用sparksql,那么就可以使用left-anti-join。
例如:从a.id=b.id的左反连接b中选择a.id

8zzbczxx

8zzbczxx4#

你也可以用一个 LEFT OUTER JOIN 在Hive中:

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

相关问题