Spark SQL分析

一. Spark SQL执行全过程

逻辑计划(LogicalPlan),理解为树形结构,逻辑算子树;
物理计划(PhysicalPlan),理解为物理算子树.
逻辑计划:
1. 未解析的逻辑算子树(Unresolved LogicalPlan),仅数据结构不包含数据信息;
2. 解析后逻辑算子树(Analyzed LogicalPlan),节点中绑定各种信息;
3. 优化后逻辑算子树(Optimized LogicalPlan),应用各种优化规则对一些低效的逻辑计划进行转换.
物理计划:
1. 根据逻辑算子树,生成物理算子树列表(Iterator[PhysicalPlan]),同样逻辑算子树可以对应多个物理算子树;
2. 从列表中按照一定策略选取最优物理算子树(SparkPlan)
3. 对选取的物理算子树做提交前的准备工作,入确保分区操作正确,物理算子节点重用,执行代码生成等.经过准备后的物理算子(Prepared SparkPlan)
4. 最终物理算子生成的RDD执行Action操作,即可提交执行.

二.Spark SQL-Sql Parse

入口SqlParse(将一个sql语句通过ast解析成unresolved logicalPlan)
SQLText -> Antlr4 -> AST(PP语法树) -> Catalyst(*优化系统) -> Unresolved Logical Plan
  1. AstBuilder.scala
    主要功能,将Antlr4的解析树转换为catalyst表达式,逻辑计划
    
    AstBuilder主要是把Antlr4解析树转换为sparksql解析树,
    具体转换为catalyst优化器中expression,逻辑计划或者TableIdentifier,
    同时该类继承了SqlBaseBaseVisitor(访问者模式)
    
  2. LegacyTypeStringParser.scala
    将case类字符串转换为数据类型的分析器。为了保持兼容性
    
  3. ParseDriver.scala
    基本SQL分析基础结构
    
  4. ParseInterface.scala
    接口类(字符串解析):
    1.逻辑计划
    2.Expression
    3.表语句
    4.函数
    5.多表达式
    6.结构化类型(传递过来的Sql字符串必须是易分割的,同时要保留完整hive元数据)
    7.DataType
    
  5. Parseutils.scala
    工具类
    

    经过上述过程我发现无论是LogicalPlan还是PhisicalPlan都始终存在三个非常重要概念,那就是如何去表示数据?中间树形数据结构?表达式到底是什么?

猜你喜欢

转载自blog.csdn.net/wc188566/article/details/107538482