【问题标题】:RIGHT/LEFT OUTER JOIN perform differently in HIVE?RIGHT/LEFT OUTER JOIN 在 HIVE 中的表现不同?
【发布时间】:2013-10-24 21:54:07
【问题描述】:

“RIGHT OUTER JOIN”和“LEFT OUTER JOIN”在 HIVE 中的表现是否不同?

例如,表 A 是一个小表。表 B 更大,并且在 col2 上进行了分区。

查询 1: SELECT * FROM A RIGHT OUTER JOIN B on (A.col=B.col) WHERE B.col2>20131001

查询 2: SELECT * FROM A LEFT OUTER JOIN B on (A.col=B.col) WHERE B.col2>20131001

查询 1 只扫描了少量分区,但查询 2 扫描了表 B 的所有分区。是 bug 还是我遗漏了什么?

谢谢!

【问题讨论】:

标签: join hive


【解决方案1】:

我也遇到过同样的情况(不知道为什么会这样,错误或功能。我肯定会认为这是错误)。由于我大量使用左外连接,因此我使用以下解决方法:

SELECT *
FROM A
LEFT OUTER JOIN
  (SELECT *
   FROM B
   WHERE B.COL2 >20131001) ON (A.COL=B.COL)

SELECT *
FROM A
LEFT OUTER JOIN B ON (A.COL= B.COL
                      AND B.COL2 > 20131001)

我正在开发 Hive 0.11 ...如果在以后的版本中修复这个问题会很有趣。

【讨论】:

    【解决方案2】:

    查询 1 表 B 是保留表,因此 B 的谓词是下推的。

    查询 2 表 B 不是保留表,因此 B 的 where 谓词不会 pushdown.hive 会 扫描整个表 B

    更多详情请参见OuterJoinBehavior

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 2013-05-02
      • 2014-01-07
      • 1970-01-01
      • 2011-03-12
      • 2012-02-27
      • 2020-01-10
      • 1970-01-01
      相关资源
      最近更新 更多