Hive - OR条件与左外连接

时间:2017-08-08 18:27:12

标签: hadoop hive union outer-join

我已经将SO上的所有查询都提到了类似的案例。虽然错误可能很常见,但我正在寻找具体案例的解决方案。请不要将问题标记为重复,除非您与已接受的解决方案完全相同。

我有两张桌子

Main table:

c1  c2  c3  c4  c5
1   2   3   4   A

Other table

c1  c2  c3  c4  c5
1   8   5   6   B
8   2   8   9   C
8   7   3   9   C
8   7   9   4   C
5   6   7   8   D

现在,从另一个表中,我应该只能在所有列中选择唯一的记录。例如最后一行(5,6,7,8, D)。

其他表中的第1行被拒绝,因为c1值(1)与主表中的c1值(1)相同,第2行被拒绝,因为其他表和主表的c2值匹配,同样...

简而言之,其他表中的列都不应该在查询输出的主表中具有相同的值(在相应的列中)。

我尝试创建以下查询

select t1.* from otherTable t1
LEFT OUTER JOIN mainTable t2
ON ( t1.c1 = t2.c1 OR t1.c2 = t2.c2 OR t1.c3 = t2.c3 OR t1.c4 = t2.c4 )
Where t2.c5 is null;

但是,hive会抛出异常

  

目前在JOIN中不支持

我理解蜂巢限制,并且很多时候我使用内部联接的UNION (ALL | DISTINCT)来克服这个限制;但是无法使用相同的策略。

请帮忙。

编辑1 :我有hive版本限制 - 只能使用版本1.2.0

1 个答案:

答案 0 :(得分:0)

您可以进行笛卡尔积连接(无条件的内连接):

select t1.* from otherTable t1
,mainTable t2
WHERE  t1.c1 != t2.c1 AND t1.c2 != t2.c2 
       AND t1.c3 != t2.c3 AND t1.c4 != t2.c4 AND t1.c5 !=  t2.c5;

假设mainTable中有一行,此查询应与使用OUTER JOIN的查询一样有效

另一种选择是将您提出的查询分解为5个不同的LEFT OUTER JOIN子查询:

select t1.* from (
  select t1.* from (
    select t1.* from (
      select t1.* from (
        select t1.* from otherTable t1
        LEFT OUTER JOIN (select distinct c1 from mainTable) t2
        ON ( t1.c1 = t2.c1) Where t2.c1 is null ) t1
      LEFT OUTER JOIN (select distinct c2 from mainTable) t2
      ON ( t1.c2 = t2.c2) Where t2.c2 is null ) t1
    LEFT OUTER JOIN (select distinct c3 from mainTable) t2
    ON ( t1.c3 = t2.c3) Where t2.c3 is null ) t1
  LEFT OUTER JOIN (select distinct c4 from mainTable) t2
  ON ( t1.c4 = t2.c4) Where t2.c4 is null ) t1
LEFT OUTER JOIN (select distinct c5 from mainTable) t2
ON ( t1.c5 = t2.c5) Where t2.c5 is null
;

在这里,对于每一列,我首先从mainTable获取不同的列,然后将其与otherTable左侧的内容联系起来。缺点是我在mainTable上传递了5次 - 每列一次。如果主表中的值是唯一的,则可以从子查询中删除distinct