逻辑计划阶段在整个流程中起着承前启后的作用。在此阶段,字符串形态的SQL语句转换为树结构形态的逻辑算子树,SQL中所包含的各种处理逻辑(过滤、剪裁等)和数据信息都会被整合在逻辑算子树的不同节点中。逻辑计划本质上是一种中间过程表示,与Spark平台无关,后续阶段会进一步将其映射为可执行的物理计划。
Spark SQL逻辑计划在实现层面被定义为LogicalPlan类。从SQL语句经过SparkSqlParser解析生成Unresolved LogicalPlan,到最终优化成为Optim ized LogicalPlan,这个流程主要经过3个阶段,如下图所示。这3个阶段分别产生Unresolved LogicalPlan、Analyzed LogicalPlan和Optimized LogicalPlan,其中Optimized LogicalPlan传递到下一个阶段用于物理执行计划的生成。
具体来讲,这3个阶段所完成的工作分别如下。
(1)由SparkSqlParser中的AstBuilder执行节点访问,将语法树的各种Context节点转换成对应的LogicalPlan节点,从而成为一棵未解析的逻辑算子树(Unresolved LogicalPlan),此时的逻辑算子树是最初形态,不包含数据信息与列信息等。
(2)由Analyzer将一系列的规则作用在Unresolved LogicalPlan上,对树上的节点绑定各种数据信息,生成解析后的逻辑算子树(Analyzed LogicalPlan)。
(3)由Spark SQL中的优化器(Optimizer)将一系列优化规则作用到上一步生成的逻辑算子树中,在确保结果正确的前提下改写其中的低效结构,生成优化后的逻辑算子树(Optimized LogicalPlan)。