详情参考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表,
对于a full outer join b ,a和b表都是 保留表。
Null Supplying table:不知道怎么翻译好,null值提供表?,其实就是在join中如果不能匹配上的使用null填充的表,a left (outer) join b 中的b表;a right (outer) join b 中的a表,
对于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)任务的map阶段提前对表进行过滤优化,使得最后参与join的表的数据量更小
直接给出结论:
1.如果是 on后面的过滤条件,是不能提前到保留表过滤执行优化。
2.如果是where后的过滤条件,是不能提前到null值保留表过滤执行优化。
给出来官网的说明:
里面包含几个谓词下推的例子:通过 explain (extended) sql 可以看到如果谓词下推,会对数据提前在map阶段过滤提升join的效率:
image.png
网友评论