内容:
1.SparkSQL下的PushDown的价值
2.SparkSQL下的Parquet下的pushDown的实现
一、SparkSQL下的PushDown的价值
1.假设通过DataFrame,df.select(a,b,c).filter(by a).filter(by b).select(c).filter(by c)这样的查询,在optimizer阶段,需要合并多个filters(CombineFilters),并调整算子间的顺序,例如将部分filter移到select等前面(PushPredicateThroughAggregate/Generate/Join/Project)。filter前需要操作一大批数据,但filter后只需要操作很小一部分数据,SQL优化时就希望一开始就只操作这一小部分数据,而不需要把所有数据都导入进来,因为最终还是要被过滤掉。
2.PushDown本身既有SQL语法的层面也有物理执行的层面。语法层面,SparkSQL和hive都有自己的语法实现。
3.PushDown是要把操作放到叶子节点上。这也是为什么叫谓词下推(Predicate pushdown)的原因。当把操作放到叶子节点时就导致操作在数据源上执行。
4.SQL角度讲有基本的过滤、语法树。语法树过滤也有2个层次,一个是基本的过滤,一个是真正的解析。优化是对各种filter进行合并,而且会调整顺序。最后从Catalyst角度,它会变成RDD进行操作,最后会装入到DataSourceStrategy。DataSourceStrategy会通过Parquet高层的API来操作Parquet。Parquet内部再收到上层的过滤条件的时候底层如何映射;