蜂巢 - 使用半连接时不存在使用

时间:2015-01-09 05:55:09

标签: hive

我需要在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子句中的右侧表的情况下形成等效查询。

还有其他解决方案吗?

2 个答案:

答案 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