目录
3.Unresolved Logic Plan 逻辑执行计划生成
4. Analyzed Logical Plan 逻辑执行计划生成
5.Optimized Logic Plan 逻辑执行计划生成
前文
Spark SQL以及Dataset体系在Spark中具有越来越重要的作用,基于RDD的体系正在被弱化,使用Dataset或者SQL编写的代码,甚至可以经过稍微修改之后迁移到Structure Streaming中进行执行。而且语法解析、语义解析和执行在很多地方也会被用到,比如规则引擎的解析和执行就可以基于语句来实现。
闲暇时间阅读了SparkSQL的一些书籍和资料,笔记如下。
正文
1.概述
用户编写的SQL是无法直接被底层计算框架执行的,必须要经过几个转换阶段,转变成框架能够识别的代码或者类对象,在Spark中,一般需要经过以下几个步骤,分为逻辑执行计划部分和物理执行计划部分。
SQL Query,需要经过词法和语法解析,由字符串转换为,树形的抽象语法树, 通过遍历抽象语法树生成未解析的逻辑语法树(unresolved logic plan),对应SQL解析后的一种树形结构,本身不包含任务数据信息,需要经过一次遍历之后,转换成成包含解析后的逻辑算子树(Analyzed LogicPlan),本身携带了各种信息,最后经过优化后得到最终的逻辑语法树(Optimized LogicPlan)。
不管解析被划分为几步,在Spark 执行环境中,都要转化成RDD的调用代码,才能被spark core所执行,示意图如下:
2. 抽象语法树生成
一般的从SQL语句语句转换成抽象的树状结构,需要经过词法分析和语法分析两个过程,实现较为繁琐,但是随着编译理论的成熟,开发人员可以借助各种各样的生成器,来实现词法分析和语法解析。
spark中使用的框架为Anylr 4,通过脚本文件进行SQL 关键字和语法的定义,然后通过框架来实现词法分析和语法分析,详情可见Antlr 百科,通过编译解析Antlr的脚本定义文件,我们可以获得如下几个重要的文件:
a.****Lexer 词法解析器
b.****Parser 语法解析器