1. SparkSqlParser 解析器 负责将输入的 SQL 文本解析成一个 AST。SparkSqlParser 包含 Astbuilder,VariableSubstitution,SparkSqlAstBuilder。 Astbuilder 围绕Antlr4 进行扩展和实现,将由 Antlr4 解析得到的 ParseTree 进而转化为 Catalyst Expression,LogicalPlan 或者 CatalystIdentifier。举个例子,Catalyst Expression:...
一、SparkSqlParser 这是sql的 解析阶段,从spark2.0后引入 ANTLR,anothor tool for language recognition 通过ANTLR 构建出 Logical Plan 逻辑计划。 这时候的 Logical Plan 之所以要叫 “Unresolved Logical Plan ”,是因为它只是一个数据结构,并不具有数据库、数据表、分区和函数等信息。 举例SQL SELECT sum(v) ...
Parser就是将SQL字符串切分成一个个Token,再根据一定语义规则解析为一棵语法树。我们写的sql语句只是一个字符串而已,首先需要将其通过词法解析和语法解析生成语法树,Spark1.x版本使用的是scala原生的parser语法解析器,从2.x后改用的是第三方语法解析工具ANTLR4, 在性能上有了较大的提升。 antlr4的使用需要定义一...
1,用户调用的spark.sql的入口是sparkSession中sql函数,该函数最终返回DataFrame(DataSet[Row]),sql的解析的过程主要是在 sessionState.sqlParser.parsePlan(sqlText)中发生的。 1. def sql(sqlText: String): DataFrame = { Dataset.ofRows(self, sessionState.sqlParser.parsePlan(sqlText)) } 1. 2. 3. 2,...
下面是SparkSqlParser的类图,使用mermaid语法中的classDiagram标识出来: classDiagram class SparkSqlParser { - conf: SQLConf + parsePlan(sqlText: String): LogicalPlan - parse(sqlText: String): TreeNode[_] } class SqlBaseLexer class SqlBaseParser ...
在阅读SqlParser前,了解学习下ANTLR4(Another Tool for Language Recognition)基础知识非常必要 ANTLR4是JAVA写的语言识别工具,它用来声明语言的语法。它的语法识别分为两个阶段 词法分析阶段:理解为把符号分成组或者符号类 解析阶段:根据词法,解析成一棵语法分析树 ...
1. Spark SQL执行流程 Spark SQL的执行流程经过了解析层、优化层、执行计划层,直到最后成为真正可执行的物理进程(例如JVM进程或Native进程)。执行流程的第一步就是解析层,解析层中的Spark SQL Parser作为最前端的组件,该组件封装了很多子组件,其中很多是基于 ANTLR 实现的。在此基础上,Spark SQL 实现了对 ...
def sql(sqlText: String): DataFrame = { Dataset.ofRows(self, sessionState.sqlParser.parsePlan(sqlText)) } 2,调用到parsePlan,将调用parse函数,传入的两个参数分为:sql语句,sqlBaseParse到LogicalPlan的一个函数。 override def parsePlan(sqlText: String): LogicalPlan = parse(sqlText) { parser =>...
3.1 如果sql命令是set开头的就调用SetCommand,这个类似Hive里的参数设定,SetCommand其实是一个Catalyst里TreeNode之LeafNode,也是继承自LogicalPlan,关于Catalyst的TreeNode库这个暂不详细介绍,后面会有文章来详细讲解。 3.2 关键是else语句块里,才是SqlParser解析SQL的核心代码: ...
val astBuilder = new SparkSqlAstBuilder(conf)是将antlr语法结构转换为catalyst表达式的关键类。 可以看到代码3中parsePlan方法先执行parse方法(代码4),在代码4中先后实例化了分词解析和语法解析类,最后将antlr的语法解析器parser:SqlBaseParser 传给了代码3中的柯里化函数,使用astBuilder转化为catalyst表达式,可以看到...