Published: 2019-05-25 20:55:00
By ytwan
In Big Data .
tags: things
目前在数据分析中,大数据中SQL分析师常用的一种,了解相应的SQL执行过程,是加深应用的一种方式。在这里主要了解SparkSQL的相关内容。
而Antlr4除了在SQL解析中使用外,在一些风控规则以及和一些业务专业人员进行使用时,也有很大的优势。即可以定义规则,然后生成相应的代码,也可以去读取配置等
Antlr4介绍
Antrl ANTLR是ANother Tool for Language Recognition的缩写
0.编程语言的通用模式:计算机语言模式
序列 sequence
选择 choice
词法符号依赖 token dependency
嵌套结构 nested phrase
处理语言规则:语法解析难点在于规则的循环处理以及分支选择,还有递归调用和复杂的计算表达式等。
处理优先级-左递归和结合性
划定词法分析器和语法分析器--
1.Antlr4的语法等信息
1. 基本信息
01. 保留字:
grammar lexer parse
import tokens options
throws catch finally
locals fragment mode
02. 符号
引号 ''
分号 ;
……等
03. 语法结构
001. 文本常量:单引号括起来的字符串
002. 词法符号 - 将相关的词法符号归类 - 词法规则 - 以大写字母开头
不能包含参数 - 返回值 - 以及局部变量
词法规则递归
符号类型 以及 词法符号对应的文本
003. 文法 - 文法规则 - 以小写字母开头 - 分析树 syntax tree 或者 parse tree
规则名 标签 内嵌代码 规则上下文 规则元素
规则以及属性
text ctx start stop
语法分析树 - 从分析树中提取
004. 左递归 - 在某个备选分支的起始位置调用自身 - 优先级
文件名 demo . g4 以下三种
混合词法和语法 gramar demo
纯词法 lexer gramar demo 可以包含 mode
纯文法 parse grammr demo
005. 内嵌代码 - @header @member 具名动作
Lexer 定义词法分析规则;
Parser 定义语法分析规则;
Tree 用于遍历语法分析树;
Combine 既可以定义语法分析规则,也可定义词法分析规则,规则名称遵循上述规则;
import 用于导入语法规则。使用 Import 语法规则分类,可以使语法规则更加清晰;
并且可以采用面向对象的思想设计规则文件,
使其具有多态及继承的思想。值得注意的是,当前规则的优先级高于导入规则。
options { language = ? ;} 来改变目标语言
2. 运行时的 API
输入流: instream
lexer
CommonTokenStream
监听以及访问者
处理非法输入的机制
错误以及异常处理机制
3. 应用案例:
案例:一般步骤:
01. 对一个语法运行 ANTLR
02. 将生成的代码于 jar 包中运行库一起编译 - 通过调用 API 实现相应的功能
03. 将编译好的代码和运行库一起运行
4. 术语
语言 language 语句 sentence
词组 phrase 子词组 subphrase
词汇符号 vocabulary
Antlr 元语言 Antlr meta - language
语法分析器 parser
句法分析器 syntax analyzer
语法 grammar 句法 syntax
词法符号 token 词法符号化 tokenizing
词法分析 lexical analysis
词法分析器 lexer
语法分析树 parse tree
树的遍历 tree walk
遍历器的实现 - 监听器 Listener
遍历器的实现 - 访问者 Visitor
解释器 interpreter 翻译器 translator
2.Antlr安装和编译等
安装
01.下载依赖包:
antlr-4.7.2-complete.jar
02.前提设置:
01.安装好Java并设置好java的环境变量
02.系统中安装部署antlr-4.7.2-complete.jar
03.添加antlr-4.7。2-complete.jar到系统环境变量CLASSPATH中
要具体到该文件名C:\ConfigFiles\Antlr\antlr-4.7.2-complete.jar
如果报错提示:找不到文件或加载主类org.antlr.v4.Tool
001.说明:设置三个环境变量:JAVA_HOME、PATH 和 CLASSPATH
PATH使得系统可以在任何路径下识别java命令-- 系统路径变量PATH
JAVA_HOME指明JDK安装路径
CLASSPATH值:CLASSPATH为java加载类(class or lib)路径
CLASSPATH C:\ConfigFiles\Antlr\antlr-4.7.2-complete.jar
类似:idea中 mark Directory as source root
03.如使用ANTLR Intellij插件来运行ANTLR工具
001.安装插件: antlr-intellij-plugin-v4-1.9.zip
添加ANTLR4插件 --本地安装-重启-然后点选 antlr v4 grammar plugin
002.在pom.xml文件添加运行库的依赖
<dependencies>
<dependency>
<groupId> org.antlr</groupId>
<artifactId> antlr4-runtime</artifactId>
<version> 4.7.3</version>
</dependency>
</dependencies>
04. 1.ANTLR代码生成配置
Hello.g4文件,点击“Configure ANTLR…”,然后便会弹出
Output directory where all output is generated”表示指定随后生成的java代码所存放的路径
在这里还有两个选项-默认生成监听器模式,访问器模式要自己勾选
2.Hello.g4的ANTLR代码生成
“Generate ANTLR Recognizer”。随后便会在app目录下看到生成的各种.java 文件等。
(上一步配置中我们设置了代码生成的目标路径为app目录)
通过调用API实现相应的功能,以及实现相应的访问器等
Spark SQL模块以及与Antlr4
1.目前大数据在使用的
Flink使用Apache Calcite,
而Calcite的解析器是使用JavaCC实现的,javaCC 是一个能生成语法和词法分析器的生成程序
Hive使用了Antlr3实现了自己的HQL,
Spark2.x以后采用了Antlr4 实现自己的解析器
Antrl:Spark SQL的语法规则文件是:SqlBase.g4
Presto是使用Antlr4
1.Spark SQL解析过程
解析过程 -- 逻辑阶段 -- 优化阶段 -- 物理执行计划
0.用户提交SQL文本
1.:基于Antlr 4 框架对 sql解析,生成抽象语法树。AST是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结
使用 AstBuilder( AstBuilder.scala)将ANTLR 4语法树结构转换成catalyst表达式逻辑计划logical plan
主要使用访问者类SparkSqlAstBuilder,但也使用了监听器辅助类 PostProcessor来处理转换格式
文法规则statement是SQL解析的核心规则
2.parser;将antlr的tree转成LogicPlan 逻辑计划
3.analyzer;通过分析器,结合Catalog,把logical plan和实际的数据绑定起来
4.Optimizer:logical plan优化,基于规则的优化;优化规则参考Optimizer,优化执行器RuleExecutor
Antlr4 SQL-- AST
AstBuilder -- Unsolved LogicalPlan
Analyzed LogicalPlan
Optimized LogicalPlan
5.Planner再将优化后的逻辑计划根据预先设定的映射逻辑转换为物理执行计划 PhysicalPlan-- prepareForExecution
6.execute
Spark SQL源码模块
Spark core
Spark SQL 模块四个子模块
01.- Catalyst (sql/catalyst) - An implementation-agnostic framework for
manipulating trees of relational operators and expressions.
02.- Execution (sql/core) - A query planner / execution engine for translating Catalyst's logical query plans into Spark RDDs.
This component also includes a new public interface, SQLContext,
that allows users to execute SQL or LINQ statements against existing RDDs and Parquet files.
03.- Hive Support (sql/hive) - Includes an extension of SQLContext called HiveContext that
allows users to write queries using a subset of HiveQL and access data from a Hive Metastore using Hive SerDes.
There are also wrappers that allows users to run queries that include Hive UDFs, UDAFs, and UDTFs.
04.- HiveServer and CLI support (sql/hive-thriftserver) - Includes support for the SQL CLI (bin/spark-sql) and a HiveServer2 (for JDBC/ODBC) compatible server.
HiveSQL-FlinkSQL
01 .Hive 是如何将 SQL 转化为 MapReduce 任务
使用 ANTLR 作为 SQL 解析的引擎,根据 DDL- > TCL- > DAL – > DCL- > DML – > DQL 这个顺序,依次查看解析引擎
Hive .g 拆成了 5 个文件,
词法规则
HiveLexer .g
语法规则的 4 个文件
SelectClauseParser .g
FromClauseParser .g
IdentifiersParser .g
HiveParser .g
02 .Flink SQL
SQL query 会经过 Calcite 解析器 转变成 SQL 节点树,通过 validate 验证 sql 语法 ( 结合 catalog ) 。
而 Calcite 的解析器是使用 JavaCC 实现的 , javaCC 是一个能生成语法和词法分析器的生成程序
最后构建成 Calcite 的抽象语法树(也就是 Logical Plan )
源码结构:
Flink 的 core API 和引擎的所有改进都会自动应用到 Table API 和 SQL 上
Flink Table API & SQL 为流式数据和静态数据的关系查询保留统一的接口,而且利用了 Calcite 的查询优化框架和 SQL parser
flink / flink-table /
sql 完全依靠 calcite ( sql parser )去做语法解析, validate 后生成 calcite logical plan . 而 Table API 先自己生成 table API 的 logical plan ,再通过 calcite relbuilder translation 成 calcite logical plan 。
table api parser : flink 会把 table api 表达的计算逻辑也表示成一颗树,用 treeNode 去表式
Sql Parser : 将 sql 语句通过 java cc 解析成 AST ( 语法树 ), 在 calcite 中用 SqlNode 表示 AST ;
源码结构:
flink-sql-client
flink-sql-parser
flink-table-common
flink-table-planner
flink-table-planner-blink
flink-table-api-java-bridge
flink-table-api-scala-bridge
flink-table-api-java
flink-table-api-scala
flink-table-runtime-blink
flink-table-ube
pom .xml
参考:
关于安装以及构建
ANTLR4的IntelliJ IDEA配置 https://www.cnblogs.com/solvit/p/10097453.html
Spark 源码 https://github.com/apache/spark/tree/master/sql
Flink SQL源码 https://github.com/apache/flink/tree/master/flink-table
Antlr4权威指南
Flink SQL 解析流程 https://www.jianshu.com/p/3191b5b91d38
Apache Calcite是什么东东 https://www.cnblogs.com/029zz010buct/p/10142264.html
【Flink SQL引擎】:Calcite 功能简析及在 Flink 的应用 http://www.pianshen.com/article/9486258228/
Blink SQL优化点 https://blog.csdn.net/r02221/article/details/85231267