在物理计划阶段,首先将经过优化后的Logical Plan将传递给queryPlanner.plan,这个阶段会生成多个可能的Physical Plans。 如果启用了CBO,将通过CBO来进一步评估和选择最优的Physical Plan执行计划,否则将选择第一个Physical Plan作为Selected Physical Plan。 在完成Selected Physical Plan后。如果启用了AQE,则SparkSQL引擎会应...
上述这个计划并不是spark真正执行的物理计划,这里面还没涉及到shuffle的操作,接下来会进行物理计划的准备阶段,也就是创建QueryExecution.executedPlan变量,这个物理计划也就是代码最终调用执行executeXXX()方法的物理计划 // executedPlan should not be used to initialize any SparkPlan. It should be // only used ...
在QueryExecution类中有 preparations 一组优化器来对物理执行计划进行优化, InsertAdaptiveSparkPlan 就是第一个优化器。 InsertAdaptiveSparkPlan 使用 PlanAdaptiveSubqueries Rule对部分SubQuery处理后,将当前 Plan 包装成 AdaptiveSparkPlanExec 。 当执行 AdaptiveSparkPlanExec 的 collect() 或 take() 方法时,全部会...
等待该方法执行完毕,全部Stage不会再改变,直接返回最终planif(isFinalPlan)returncurrentPhysicalPlan// In case of this adaptive plan being executed out of `withActive` scoped functions, e.g.,// `plan.queryExecution.rdd`, we need to set active session here as new plan nodes...
这里面首先创建了QueryExecution类对象,QueryExecution中定义了sql执行过程中的关键步骤,是sql执行的关键类,但会一个dataframe类型的对象。QueryExecution类中的成员都是lazy(懒惰)的,被调用时才会执行。只有等到程序中出现action算子时,才会调用queryExecution类中的executed Plan成员,原来生成的逻辑执行计划才会被优化器优化...
上面的代码中,实现了QueryExecutionListener 这个trait中的onSuccess和onFailure这两个方法,只有在onSuccess时,才需要获取执行计划的数据,因为只有onSuccess时的血缘才是有效的。 实现好了自定义的QueryExecutionListener后,可以通过sparkSession.listenerManager.register来将自己实现的PlanExecutionListener 注册到Spark会话中,li...
QueryPlan下面的两个子类分别是LogicalPlan(逻辑执行计划)和SparkPlan(物理执行计划)。QueryPlan内部带有output:Seq[Attribute]、transformExpressionDown和transformExpressionUp等方法,它的主要子体系是LogicalPlan,即逻辑执行计划表示,它在Catalyst优化器里有详细实现。LogicalPlan内部带一个reference:Set[Attribute],主要方法为...
DataSet对象调用SparkSession的SessionState的executePlan方法(这是一个函数)返回一个QueryExecution 构造QueryExecution的过程是分析(Catalog)->优化->转化为逻辑计划的过程 DataSet对象调用QueryExecution的assertAnalyzed()方法,判断是否已分析 DataSet对象通过DataSet类创建一个DataSet实例。同时传入RowEncoder即Schema并返回一个...
query.printSchema 2.2 查看查询的整个执行计划 query.queryExecution 2.3 查看查询的Unresolved LogicalPlan query.queryExecution.logical 2.4 查看查询的analyzed LogicalPlan query.queryExecution.analyzed 2.5 查看优化后的LogicalPlan query.queryExecution.optimizedPlan ...
创建SparkPlan 接着,回来QueryExecution这个方法,继续往下,就是创建SparkPlan了,这里用Optimizer针对Resolved LogicalPlan生成的Optimized LogicalPlan,用SparkPlanner,创建一个SparkPlan。点击进入planner,在点击SparkPlanner,进入此类,如下: 这里,会用一些策略,比如说DataSourceStrategy,针对逻辑执行计划,执行进一步的具体化和物...