Hive non-equi Join on OR 条件

Posted

技术标签:

【中文标题】Hive non-equi Join on OR 条件【英文标题】:Hive non-equi Join on OR condition 【发布时间】:2021-07-09 16:15:52 【问题描述】:

我有两个表要加入 3 个键。但是,其中一个键可能包含另一个表中不存在的值,但我仍然希望在查询时保留这些记录。

与此类似,first_table 中的 key_3 可能包含 second_table 中不存在的值 0。

SELECT
  f.key_1,
  f.key_2,
  f.key_3,
  s.column_4
FROM 
  first_table f
  LEFT OUTER JOIN second_table s
    ON f.key_1 = s.key_1
    AND f.key_2 = s.key_2
    AND (f.key_3 = s.key_3 OR f.key_3 = 0)

当我运行它时,我得到一个错误 OR not supported in JOIN current '0'。我知道在 Hive 的较新版本中这是允许的,但在旧版本中是否有解决方法。

【问题讨论】:

【参考方案1】:

将带有 OR 的条件移至 WHERE 子句:

SELECT
  f.key_1,
  f.key_2,
  f.key_3,
  s.column_4
FROM 
  first_table f
  LEFT OUTER JOIN second_table s
    ON f.key_1 = s.key_1
    AND f.key_2 = s.key_2
WHERE f.key_3 = s.key_3 
   OR f.key_3 = 0
   OR s.key_1 is NULL --allow not joined records

【讨论】:

【参考方案2】:

我可能不完全理解你的问题,但是一个简单的left join 不就是你想要的吗?

SELECT f.key_1, f.key_2, f.key_3, s.column_4
FROM first_table f LEFT OUTER JOIN
     second_table s
      ON f.key_1 = s.key_1 AND
         f.key_2 = s.key_2 AND
         f.key_3 = s.key_3 ;

如果第二个表中没有匹配项(无论第一个表中的值如何),仍会返回第一个表中的行。

【讨论】:

以上是关于Hive non-equi Join on OR 条件的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别