这两个Hive查询连接两个表并过滤分区键是否存在性能差异?

时间:2014-01-16 00:00:36

标签: hql hive

假设表AB都有ds作为分区键。

方法1

SELECT * 
FROM A JOIN B ON A.userid=B.userid 
WHERE A.ds='2014-01-01' AND B.ds='2014-01-01'

方法2

SELECT * 
FROM (
SELECT * FROM A WHERE A.ds='2014-01-01'
) JOIN (
SELECT * FROM B WHERE B.ds='2014-01-01'
) ON
A.userid=B.userid 

第二个查询会更快吗?

我想知道WHEREJOIN在Hive中是如何运作的。在可能的情况下,是否在连接之前将where子句应用于源表(只要该子句只包含一个表别名,如上所述),或者只在表连接后才应用它(例如{必须在加入后应用{1}}?

1 个答案:

答案 0 :(得分:4)

你的问题实际上是关于蜂巢中的谓词下推 在上面的情况下,执行将与hive在连接之前将谓词A.ds='2014-01-01' AND B.ds='2014-01-01'推送到映射器完全相同。

在更一般的情况下,JOIN(内连接)实际上非常简单,可归纳为:
如果它可以推动,它会推动。
它可以在只有一个表(where a.x > 1)时推送谓词,并且当涉及多于一个表(A.userid > B.userid)时无法推送,因为映射器读取其中一个表的分割只有..

更复杂的部分是OUTER JOIN,并且非常清楚地解释了here

P.S。
谓词下推由hive.optimize.ppd控制,默认为真。