詳情參考hive:
https://cwiki.apache.org/confluence/display/Hive/OuterJoinBehavior#OuterJoinBehavior-Examples
基本概念介紹
首先定義了join的四種類型的表:
Preserved Row table:
保留表锹雏,通俗地說就是 a left (outer) join b 中的a表;a right (outer) join b 中的b表蛹找,
對(duì)于a full outer join b 全闷,a和b表都是 保留表油额。
Null Supplying table:不知道怎么翻譯好,null值提供表?,其實(shí)就是在join中如果不能匹配上的使用null填充的表怎顾,a left (outer) join b 中的b表;a right (outer) join b 中的a表,
對(duì)于a full outer join b 漱贱,a和b表都是 null值保留表
During Join predicate:join中謂詞槐雾,on后面的條件: in 'R1 join R2 on R1.x = 5,
R1.x = 5就是join中謂詞幅狮。
After Join predicate:join后謂詞募强,where后面的條件: a left join b where a.t=1,
a.t=1 就是join后謂詞
所謂的謂詞下推就是在join之前的mr(spark)任務(wù)的map階段提前對(duì)表進(jìn)行過濾優(yōu)化株灸,使得最后參與join的表的數(shù)據(jù)量更小
直接給出結(jié)論:
1.如果是 on后面的過濾條件,是不能提前到保留表過濾執(zhí)行優(yōu)化钻注。
2.如果是where后的過濾條件蚂且,是不能提前到null值保留表過濾執(zhí)行優(yōu)化配猫。
給出來官網(wǎng)的說明:
里面包含幾個(gè)謂詞下推的例子:通過 explain (extended) sql 可以看到如果謂詞下推幅恋,會(huì)對(duì)數(shù)據(jù)提前在map階段過濾提升join的效率: