一. 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
-
AstBuilder.scala
主要功能,将Antlr4的解析树转换为catalyst表达式,逻辑计划
AstBuilder主要是把Antlr4解析树转换为sparksql解析树, 具体转换为catalyst优化器中expression,逻辑计划或者TableIdentifier, 同时该类继承了SqlBaseBaseVisitor(访问者模式)
-
LegacyTypeStringParser.scala
将case类字符串转换为数据类型的分析器。为了保持兼容性
-
ParseDriver.scala
基本SQL分析基础结构
-
ParseInterface.scala
接口类(字符串解析): 1.逻辑计划 2.Expression 3.表语句 4.函数 5.多表达式 6.结构化类型(传递过来的Sql字符串必须是易分割的,同时要保留完整hive元数据) 7.DataType
-
Parseutils.scala
工具类
经过上述过程我发现无论是LogicalPlan还是PhisicalPlan都始终存在三个非常重要概念,那就是如何去表示数据?中间树形数据结构?表达式到底是什么?