Hive - 使用半连接中不存在使用



我需要在Hive中使用NOT IN查询。

我有 3 张表 A、B 和 C。

B 包含字段 PRODUCT、ID 和 VALUE。C 与字段 ID 和值。

我需要将表 B 中的行写入表 A,该表 B 在表 C 中没有匹配的 ID 和 VALUE 字段。

INSERT OVERWRITE TABLE A a SELECT * FROM B b LEFT SEMI JOIN C c ON (b.ID = c.ID AND b.VALUE = c.VALUE) where b.ID = NULL AND b.VALUE = NULL;

http://stackoverflow.com/questions/25041026/hive-left-semi-join-for-not-exists的这个建议不起作用,因为我在 WHERE 子句中引用了右侧表,这不应该这样做。

如何在不引用 WHERE 子句中的右侧表的情况下形成等效查询。

还有其他解决方案吗?

解决方案:

检查目标表是否包含两个表中的所有字段。因为,这里用了*。

然后它应该是 b.VALUE IS NULL 而不是 = NULL。

查询应如下所示:

INSERT OVERWRITE TABLE A a 
SELECT * FROM B b 
LEFT SEMI JOIN C c 
ON (b.ID = c.ID AND b.VALUE = c.VALUE) where 
b.ID IS NULL AND b.VALUE IS NULL;

Hive 似乎从 0.13 开始支持 IN、NOT IN、EXIST和 NOT EXISTS

Select A.Id,A.*
From A
Where EXISTS (Select 1 From B where A.ID = B.ID)
EXISTS

和 NOT EXISTS 中的子查询应该具有相关的谓词(如上面示例中的 b.ID = a.ID) 有关详细信息,请参阅 Hive Wiki> WHERE 子句中的子查询

最新更新