Hive - 使用 NOT Exists 使用 Semi Join

Hive - Use NOT Exists in Using Semi Join

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

我有 3 tableA、B 和 C。

B 包含字段 PRODUCT、ID 和 VALUE。 具有字段 ID 和 VALUE 的 C。

我需要将 table B 中的行写入 table A,其中在 table 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;

的建议无效,因为我在 WHERE 子句中提到了右侧 table,这是不应该做的。

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

还有其他解决方案吗?

解决方案:

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

那么, 它应该是 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)

EXIST 和 NOT EXISTS 中的子查询应该有相关的谓词(如上面示例中的 b.ID = a.ID)更多信息,请参阅 Hive Wiki > Subqueries in the WHERE Clause