• spark_sql_解析器


    解析器优点: 如果没有解析器,你可能每次都去别的地方去查询,转换、在解析。 有了解析器(内含所有解析的语法),就直接解析。

    idea安装antlr插件

    创建xx.g4文件

    Test01.g4

    grammar Test01;
    
    oxinit  :  '{' value (',' value)*  '}';
    
    value   :   XX
            |   oxinit;
    
    
    
    XX : [0-9]+;
    WS  : [ 	
    ]+  -> skip;

    Configure ANTLR 配置输出目录

    Generate ANTLR Recognizer 生成解析语法类

    scala测试:

      def main(args: Array[String]): Unit = {
    
    
        val lexer = new Test01Lexer(new ANTLRInputStream("{1,{2,3},4}"))
    
        val token = new CommonTokenStream(lexer)
        val parser = new Test01Parser(token)
        val tree: ParseTree = parser.oxinit()
    
        println(tree.toStringTree(parser))
        
      }
    
    
    结果:
    (oxinit { (value 1) , (value (oxinit { (value 2) , (value 3) })) , (value 4) })

    sql源码解析器

      def sql(sqlText: String): DataFrame = {
        Dataset.ofRows(self, sessionState.sqlParser.parsePlan(sqlText))
      }
    
    .sqlParser.parsePlan(sqlText)
    
    
    
      override def parsePlan(sqlText: String): LogicalPlan = parse(sqlText) { parser =>
        astBuilder.visitSingleStatement(parser.singleStatement()) match {
          case plan: LogicalPlan => plan
          case _ =>
            val position = Origin(None, None)
            throw new ParseException(Option(sqlText), "Unsupported SQL statement", position, position)
        }
      }
    
    
    
     parse(sqlText)
    
    类似:
    
       val lexer = new SqlBaseLexer(new UpperCaseCharStream(CharStreams.fromString(command)))
        lexer.removeErrorListeners()
        lexer.addErrorListener(ParseErrorListener)
    
        val tokenStream = new CommonTokenStream(lexer)
        val parser = new SqlBaseParser(tokenStream)
        parser.addParseListener(PostProcessor)
        parser.removeErrorListeners()
        parser.addErrorListener(ParseErrorListener)
  • 相关阅读:
    提升Android编译速度
    NYOJ 158 省赛来了
    浅谈 ZipArchive 类
    块状元素的text-align对齐属性
    BestCoder Round #2 1001 TIANKENG’s restaurant
    Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)
    【HRS项目】Axure兴许问题解决---与SVN结合
    软件质量之道:PCLint之中的一个
    字典树 一种高速插入查询数据结构
    【JS】JavaScript引擎的内部执行机制
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14539969.html
Copyright © 2020-2023  润新知