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
我需要在 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