Spark SQL Catalyst源码分析之Analyzer

本文详细介绍了Spark SQL的Analyzer组件,分析了Analyzer如何将Sql Parser生成的Unresolved Logical Plan转化为Resolved Logical Plan。Analyzer通过一系列规则(如ResolveReferences、ResolveRelations、StarExpansion等)对逻辑计划进行解析,利用Catalog和FunctionRegistry完成元数据和函数的解析。Analyzer的执行基于RuleExecutor,通过迭代应用Batch中的规则,直至达到Fix Point。
摘要由CSDN通过智能技术生成

 /** Spark SQL源码分析系列文章*/

    前面几篇文章讲解了Spark SQL的核心执行流程和Spark SQL的Catalyst框架的Sql Parser是怎样接受用户输入sql,经过解析生成Unresolved Logical Plan的。我们记得Spark SQL的执行流程中另一个核心的组件式Analyzer,本文将会介绍Analyzer在Spark SQL里起到了什么作用。

    Analyzer位于Catalyst的analysis package下,主要职责是将Sql Parser 未能Resolved的Logical Plan 给Resolved掉。

    

一、Analyzer构造

    Analyzer会使用Catalog和FunctionRegistry将UnresolvedAttribute和UnresolvedRelation转换为catalyst里全类型的对象。

    Analyzer里面有fixedPoint对象,一个Seq[Batch].

 

 

 
  1. class Analyzer(catalog: Catalog, registry: FunctionRegistry, caseSensitive: Boolean)

  2. extends RuleExecutor[LogicalPlan] with HiveTypeCoercion {

  3.  
  4. // TODO: pass this in as a parameter.

  5. val fixedPoint = FixedPoint(100)

  6.  
  7. val batches: Seq[Batch] = Seq(

  8. Batch("MultiInstanceRelations", Once,

  9. NewRelationInstances),

  10. Batch("CaseInsensitiveAttributeReferences", Once,

  11. (if (caseSensitive) Nil else LowercaseAttributeReferences :: Nil) : _*),

  12. Batch("Resolution", fixedPoint,

  13. ResolveReferences ::

  14. ResolveRelations ::

  15. NewRelationInstances ::

  16. ImplicitGenerate ::

  17. StarExpansion ::

  18. ResolveFunctions ::

  19. GlobalAggregates ::

  20. typeCoercionRules :_*),

  21. Batch("AnalysisOperators", fixedPoint,

  22. EliminateAnalysisOperators)

  23. )

    Analyzer里的一些对象解释:

 

    FixedPoint:相当于迭代次数的上限。

 

 
  1. /** A strategy that runs until fix point or maxIterations times, whichever comes first. */

  2. case class FixedPoint(maxIterations: Int) extends Strategy

 

    Batch: 批次,这个对象是由一系列Rule组成的,采用一个策略(策略其实是迭代几次的别名吧,eg:Once)

 

 
  1. /** A batch of rules. */,

  2. protected case class Batch(name: String, strategy: Strategy, rules: Rule[TreeType]*)

   Rule:理解为一种规则,这种规则会应用到Logical Plan 从而将UnResolved 转变为Resolved

 

 

 
  1. abstract class Rule[TreeType <: TreeNode[_]] extends Logging {

  2.  
  3. /** Name for this rule, automatically inferred based on class name. */

  4. val ruleName: String = {

  5. val className = getClass.getName

  6. if (className endsWith "$") className.dropRight(1) else className

  7. }

  8.  
  9. def apply(plan: TreeType): TreeType

  10. }


   Strategy:最大的执行次数,如果执行次数在最大迭代次数之前就达到了fix point,策略就会停止,不再应用了。

 

 

 
  1. /**

  2. * An execution strategy for rules that indicates the maximum number of executions. If the

  3. * execution reaches fix point (i.e. converge) before maxIterations, it will stop.

  4. */

  5. abstract class Strategy { def maxIterations: Int }


   Analyzer解析主要是根据这些Batch里面定义的策略和Rule来对Unresolved的逻辑计划进行解析的。

 

   这里Analyzer类本身并没有定义执行的方法,而是要从它的父类RuleExecutor[LogicalPlan]寻找,Analyzer也实现了HiveTypeCosercion,这个类是参考Hive的类型自动兼容转换的原理。如图:

    

    RuleExecutor:执行Rule的执行环境,它会将包含了一系列的Rule的Batch进行执行,这个过程都是串行的。

    具体的执行方法定义在apply里:

    可以看到这里是一个while循环,每个batch下的rules都对当前的plan进行作用,这个过程是迭代的,直到达到Fix Point或者最大迭代次数。

 

 
  1. def apply(plan: TreeType): TreeType = {

  2. var curPlan = plan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值