蜂巢左半连接'NOT EXISTS'



我有两个表,每个表有一个键列。表a中的键是表b中所有键的子集,我需要从表b中选择不在表a中的键

这是Hive手册中的一段引文:LEFT SEMI JOIN以一种有效的方式实现了不相关的IN/EXISTS子查询语义。从Hive 0.13开始,使用子查询支持IN/NOT IN/EXISTS/NOT EXISTS操作符,因此大多数连接不再需要手动执行。使用LEFT SEMI - JOIN的限制是右边的表只能在连接条件(on -子句)中被引用,而不能在WHERE-或select -子句中被引用。"

他们用这个例子来说明:

    SELECT a.key, a.value FROM a WHERE a.key IN (SELECT b.key FROM B);

等价于

    SELECT a.key, a.val FROM a LEFT SEMI JOIN b ON (a.key = b.key);

然而,我需要做的是第一个带有'NOT IN;不幸的是,Hive 0.13不支持这种语法。仅作说明:

    SELECT a.key, a.value FROM a WHERE a.key NOT IN (SELECT b.key FROM B);

我搜索了这个网站的推荐,看到了这个例子:

    SELECT a.key FROM a LEFT OUTER JOIN b ON a.key = b.key WHERE b.key IS NULL;

它不像预期的那样工作。当我连接a key NOT in b和a key in b时,我不会得到原来的a。也许这是因为这个查询不能做到这一点,注意粗体文本- b.k key不应该出现在WHERE.

那我该怎么办呢?还有其他技巧吗?谢谢!

注:我不能分享任何真实的数据;这是一个非常简单的例子,其中a中的键都包含在b中并且a是b的子集

如果您想要表b的结果,也许您可以执行以下操作?

  SELECT b.key FROM b LEFT OUTER JOIN a ON b.key = a.key WHERE a.key IS NULL;

你的问题的答案应该是

SELECT a.key FROM a LEFT OUTER JOIN b ON a.key = b.key WHERE b.key IS NULL;

这意味着,从a中取出所有的键,而不管b中是否有匹配。where原因将过滤b中不可用的那些记录。

或者你可以试试

SELECT a.key FROM a LEFT ANTI JOIN b ON a.key = b.key

我尝试在cdh 5.7.0与spark 1.6版本的IN函数左半连接。

半左连接给出错误的结果,这与子查询中的IN函数不同。

最新更新