如何替换 HIVE Join 中的 OR 条件

Posted

技术标签:

【中文标题】如何替换 HIVE Join 中的 OR 条件【英文标题】:How can I replace the OR condition in HIVE Join 【发布时间】:2016-12-22 06:06:45 【问题描述】:

我有以下两张表

Employee(age,name,dpt_cd,dpt_rg_cd)
Department(dpt_id,dpt_cd,dpt_rg_cd)

我想对这些表执行以下查询,但不幸的是 HIVE 不支持 OR in JOIN 条件。如何在没有 OR 条件的情况下重写查询并给出相同的结果

SELECT * FROM employee LEFT OUTER JOIN department ON (employee.dpt_cd =department.dpt_cd OR (employee.dpt_cd ='' AND employee.dpt_rg_cd= employee.dpt_rg_cd ))  

【问题讨论】:

【参考方案1】:

只需在 where 子句中使用您的条件并将 1=1 放入 on 子句。像下面这样:

SELECT * FROM employee LEFT OUTER JOIN department ON ( 1=1) 
where employee.dpt_cd =department.dpt_cd OR 
      (employee.dpt_cd ='' AND employee.dpt_rg_cd= employee.dpt_rg_cd )

【讨论】:

我只是将它用作在 on 子句中始终返回 true 的虚拟条件。如果你愿意,你可以跳过它。 我们首先执行外连接,来自外连接的任何未匹配的行都将在所有列中具有空值。我们应用我们的 where 子句,因为我们在空列上应用条件它不会起作用。这是正确的吗? 当你比较空值时,结果总是假的。所以这些行将被过滤。这就是我们所期望的对吧? ok Puneet...所以这个 (1=1) 用于在非空记录上应用 where 条件。因此,上面的查询将给出与我发布的查询相同的结果? 我已经测试了代码......结果给出了与内部连接相同的结果【参考方案2】:

要解决 hive 中的多个 equerry 问题,请使用 semi left join ie

select x.*
from employee x
LEFT SEMI JOIN  department   b on (x.buyer_id= b.id )
LEFT SEMI JOIN  department   c on (x.seller_id= c.id )

【讨论】:

【参考方案3】:

您可以将查询重写为两个带有联合的选择,如下所示:

select * from employee left outer join department on (employee.dpt_cd =department.dpt_cd)
union all
select * from employee left outer join department on (employee.dpt_rg_cd = employee.dpt_rg_cd) where employee.dpt_cd ='';

这可能是一个非常慢的查询,但应该会产生您想要的结果。

【讨论】:

谢谢 Finbarr....但是由于我们在两个查询中都使用左外连接,结果将有不满足条件的记录重复

以上是关于如何替换 HIVE Join 中的 OR 条件的主要内容,如果未能解决你的问题,请参考以下文章

【Hive】Hive Join 介绍

如何根据 JSON 中的字段对两个表进行 Hive JOIN?

或者 Hive 中的 JOIN 错误当前不支持

Hive中的Join总结

如何替换 hive 列中的特殊字符?

Hive non-equi Join on OR 条件