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)
原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14539969.html