Antlr4和Spark SQL的联系介绍

目前在数据分析中,大数据中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
    源码结构:
    Flinkcore API和引擎的所有改进都会自动应用到Table APISQL
    Flink Table API&SQL 为流式数据和静态数据的关系查询保留统一的接口,而且利用了Calcite的查询优化框架和SQL parser
       flink/flink-table/
        sql完全依靠calcitesql parser)去做语法解析,validate后生成calcite logical plan. Table API先自己生成table APIlogical plan,再通过calcite relbuilder translationcalcite 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

blogroll

social