我们知道spark有很多优化规则,这些优化规则有具体的排序要求吗?决定这些顺序的原则是什么?
更具体地说,例如,我知道ColumnPruning需要添加一个项目来选择尽可能少的靠近数据源的列。 PushDownPredicate 需要将谓词推送到尽可能靠近数据源的位置。
这两种执行计划,哪一种更合适呢? 案例1:LocalRelation附近的项目
Filter (key#0 < 10)
+- Filter (rand(0) > 0.5)
+- Project [key#0]
+- LocalRelation <empty>, [key#0, value#0]
案例2:LocalRelation附近的过滤器
Project [key#0]
+- Filter (key#0 < 10)
+- Filter (rand(0) > 0.5)
+- LocalRelation <empty>, [key#0, value#0]
在spark单元测试中,case2是预期的结果
每个版本中使用的顺序和规则都会发生变化(例如 OSS 和 Databricks 之间的顺序和规则不同)。
实际代码是查找此信息的最佳位置(3.5 分支):Optimizer.scala defaultBatches、batches 和 nonExcludableRules
批量功能显示各个阶段的路径。
计划最终的效果取决于实施情况,例如不要依赖 OSS Spark 与供应商的实现中的低行为。
此外,文件或内存中的基础数据类型也会影响所使用的计划。