假设这两个表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'
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)
第二个查询会更快吗?
我不知道如何WHERE和JOIN在蜂巢的作品.是where施加子句源表之前,加入可能的(只要子句仅包含一个表的别名,如上述的那些)时,或者是它总是表的连接之后才施加(例如A.userid > B.userid具有后的施加加入)?
您的问题实际上是关于配置单元中的谓词下推。在上面的情况下,执行将与 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。
| 归档时间: |
|
| 查看次数: |
4230 次 |
| 最近记录: |