Antlr4 自定义实现SparkSQL的解析

作者: 大猪大猪 | 来源:发表于2019-03-03 21:38 被阅读51次

Antlr4 是一个强大的解析器的生成器,可以用来读取、处理、执行或翻译结构化文本,ANTLR可以从语法上来生成一个可以构建和遍历解析树的解析器,最出名的Spark计算引擎2.x就是用它来解析SQL的,是一个牛到没朋友的家伙。

IDEA测试

IDEA语法分析插件
下载 antlr-v4-grammar-plugin

插件安装

antlr-v4-grammar分析插件

g4语法文件使用的是sparkSQL的SqlBase.g4的文件进行改造的 ArcSql.g4

右键选中 multiStatement 进行测试

antlr4

测试SQL语法树

antlr4-SQL-测试

生成解析配置

antlr4-生成解析代码
  1. 右键ArcSQL.g4文件,在下拉选项Configure ANTLR即可出来。
  2. 第一个Output directory...要写上输出代码的路径。
  3. 比如把它放到当前项目的antlr4的包中/dounine/github/arc/src/main/scala/com/dounine/arc/antlr4
  4. 右键ArcSQL.g4文件,选中Generate ANTLR Recognizer即可生成
  5. 会生成如下几个文件
ArcSQL.interp
ArcSQL.tokens
ArcSQLBaseListener
ArcSQLBaseVisitor
ArcSQLLexer
ArcSQLLexer.interp
ArcSQLLexer.tokens
ArcSQLListener
ArcSQLParser
ArcSQLVisitor

代码测试

依赖

compile group: 'org.antlr', name: 'antlr4', version: '4.7.2'

被动模式(树解析到节点了通知)

val loadLexer = new ArcSQLLexer(CharStreams.fromString(
      """
        select toUp(name) from log;
      """))
val tokens = new CommonTokenStream(loadLexer)
val parser = new ArcSQLParser(tokens)
val ctx = parser.multiStatement()
val listener = new ArcSQLBaseListener() {
      override def exitQuerySpecification(ctx: ArcSQLParser.QuerySpecificationContext): Unit = {
        val input = ctx.start.getTokenSource.asInstanceOf[ArcSQLLexer]._input
        val start = ctx.start.getStartIndex
        val stop = ctx.stop.getStopIndex
        val interval = new Interval(start, stop)
        val sqlText = input.getText(interval)
        println("表名 => " + ctx.tableAlias().strictIdentifier().getText)
        println("完整SQL =>" + sqlText)
      }
    }
ParseTreeWalker.DEFAULT.walk(listener, ctx)

输出(在ctx中还有很多关于sql树信息)

表名 => log
完整SQL =>select toUp(name) from log

主动模式(主动去要数据)

val vistor = new ArcSQLBaseVisitor[Unit] {

      override def visitQuerySpecification(ctx: QuerySpecificationContext): Unit = {
        val input = ctx.start.getTokenSource.asInstanceOf[ArcSQLLexer]._input
        val start = ctx.start.getStartIndex
        val stop = ctx.stop.getStopIndex
        val interval = new Interval(start, stop)
        val sqlText = input.getText(interval)
        println("表名 => " + ctx.tableAlias().strictIdentifier().getText)
        println("完整SQL =>" + sqlText)
      }
}
vistor.visit(ctx)

相关文章

  • Antlr4 自定义实现SparkSQL的解析

    Antlr4 是一个强大的解析器的生成器,可以用来读取、处理、执行或翻译结构化文本,ANTLR可以从语法上来生成一...

  • 通过自定义SparkSQL外部数据源实现SparkSQL读取HB

    通过自定义SparkSQL外部数据源实现SparkSQL读取HBase 标签: SparkSQL HBase Sa...

  • 【Hive】注册UDF的过程

    实现步骤 对比SparkSQL注册UDF的过程SparkSQL用户自定义函数UDF和UDAF、UDTF[https...

  • Skywalking-07:OAL原理——解释器实现

    OAL 解释器实现 OAL 解释器是基于 Antlr4 实现的,我们先来了解下 Antlr4 Antlr4 基本介...

  • SparkSQL之自定义UDF

    当SparkSQL里内置的函数无法满足我们业务需求时,我们可以通过自定义UDF来实现。 1、自定义ConcatLo...

  • spark 定制 UDF

    好久没有发布文章,今天抽点时间写个 spark 自定义 UDF 函数,使用 sparksql 实现数据内部的两两比...

  • antlr4 精简入门

    antlr4 是什么 antlr 是一个由java编写的语法识别工具,官方介绍为Antlr4是一款强大的解析器生成...

  • Antlr 4 的 备忘

    overview Antlr4 是一个强大的解析器的生成器,实现的词法/语法分析,可以用来读取、处理、执行或翻译结...

  • 1-3自定义标签解析-Spring源码分析

    看文章之前 首先问自己几个问题: 1自定义标签解析是如何实现bean的解析和注册的 2自定义标签解析和默认标签解析...

  • Java实现双分派

    最近在看SparkSQL的实现,推荐一本书《SparkSQL 内核剖析》,讲的很好。关于SparkSQL如何把一条...

网友评论

    本文标题:Antlr4 自定义实现SparkSQL的解析

    本文链接:https://www.haomeiwen.com/subject/jrnmuqtx.html