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

Xia*_*hao 7 hive hql

假设这两个表A,并Bds他们的分区键.

方法1

SELECT * 
FROM A JOIN B ON A.userid=B.userid 
WHERE A.ds='2014-01-01' AND B.ds='2014-01-01'
Run Code Online (Sandbox Code Playgroud)

方法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 
Run Code Online (Sandbox Code Playgroud)

第二个查询会更快吗?

我不知道如何WHEREJOIN在蜂巢的作品.是where施加子句源表之前,加入可能的(只要子句仅包含一个表的别名,如上述的那些)时,或者是它总是表的连接之后才施加(例如A.userid > B.userid具有后的施加加入)?

dim*_*mah 5

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

在更一般的情况下,JOIN(内连接)实际上非常简单,可以总结为:
如果它可以推送,它就会推送。
当仅涉及一张表时,它可以推送谓词 ( where a.x > 1),而当涉及多于 1 个表时 ( A.userid > B.userid) 则无法推送谓词,因为映射器仅读取其中一张表的拆分。

更复杂的部分在这里OUTER JOIN解释得非常清楚。

PS
谓词下推由其控制,hive.optimize.ppd默认情况下为 true。