我有两个表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。
iqjalb3h1#
你想做一个 IN 因此:
IN
SELECT id FROM A WHERE id IN (SELECT id FROM B)
Hive上有一层 LEFT SEMI JOIN :
LEFT SEMI JOIN
SELECT a.key, a.val FROM a LEFT SEMI JOIN b on (a.key = b.key)
zbsbpyhn2#
Hive似乎支持 IN , NOT IN , EXIST 以及 NOT EXISTS 从0.13开始。
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 应该有相关的 predicate (比如 b.tailnum = a.tailnum 在上面的示例中)有关更多信息,请参阅where子句中的hivewiki>subquerys
b.tailnum = a.tailnum
cnjp1d6j3#
如果可以使用sparksql,那么就可以使用left-anti-join。例如:从a.id=b.id的左反连接b中选择a.id
8zzbczxx4#
你也可以用一个 LEFT OUTER JOIN 在Hive中:
LEFT OUTER JOIN
SELECT A.id FROM A LEFT OUTER JOIN B ON (B.id = A.id) WHERE B.id IS null
4条答案
按热度按时间iqjalb3h1#
你想做一个
IN
因此:Hive上有一层
LEFT SEMI JOIN
:zbsbpyhn2#
Hive似乎支持
IN
,NOT IN
,EXIST
以及NOT EXISTS
从0.13开始。中的子查询
EXIST
以及NOT EXISTS
应该有相关的 predicate (比如b.tailnum = a.tailnum
在上面的示例中)有关更多信息,请参阅where子句中的hivewiki>subqueryscnjp1d6j3#
如果可以使用sparksql,那么就可以使用left-anti-join。
例如:从a.id=b.id的左反连接b中选择a.id
8zzbczxx4#
你也可以用一个
LEFT OUTER JOIN
在Hive中: