我需要在Hive中使用NOT IN查询。
我有3张表A,B和C.
B,包含PRODUCT,ID和VALUE字段。 C,字段ID和VALUE。
我需要将表B中的行(表C中没有匹配的ID和VALUE字段)写入表A.
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子句中的右侧表的情况下形成等效查询。
还有其他解决方案吗?
答案 0 :(得分:0)
解决方案:
检查目标表是否包含两个表中的所有字段。因为,这里使用*。
然后, 它应该是b.VALUE IS NUL L而不是 = 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;
答案 1 :(得分:0)
Hive似乎支持IN,NOT IN,EXIST和NOT EXISTS 0.13
.Lambda #Lambda1<System.Func`2[ConsoleApp.Program+Name,System.Boolean]>(ConsoleApp.Program+Name $name)
{
$name.LastName == "ABC"
}
EXIST和NOT EXISTS中的子查询应该具有相关谓词(如上例中的b.ID = a.ID)有关更多信息,请参阅Hive Wiki > Subqueries in the WHERE Clause