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)
  • 相关阅读:
    day12_字符连接单引号转意字符
    day12_存储过程说明
    day12_PLSQL编程--存储过程---统一发布动态属性管理
    linux关闭celinux服务
    day11__表管理
    day11_分区表------子分区的母模板(11g)
    day11_分区表------子分区的母模板(10g)
    day11_分区表——分区表常用维护
    smartforms 中的currquan单位处理
    当SVN服务器端IP地址发生变化时,客户端重新定位
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14539969.html
Copyright © 2011-2022 走看看