假设表A
和B
都有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
第二个查询会更快吗?
我想知道WHERE
和JOIN
在Hive中是如何运作的。在可能的情况下,是否在连接之前将where
子句应用于源表(只要该子句只包含一个表别名,如上所述),或者只在表连接后才应用它(例如{必须在加入后应用{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
控制,默认为真。