zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    公众号开发笔记一
    公众号开发笔记一
    ArrayList,LinkedList和String
    ArrayList,LinkedList和String
    第56节:ArrayList,LinkedList和String
    第55节:Java当中的IO流-时间api(下)-上
    Java当中的IO流-时间api(下)-上
    当用python读取几十万行文本时,会出现什么状况?
    Python 如何定义只读属性?【新手必学】
    Python之数据分析工具包介绍以及安装【入门必学】
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14539969.html
Copyright © 2011-2022 走看看