spark sql 2.3 源碼解讀 - antlr4 && SparkSqlParser (2.1)

? 接著上一篇文章,本章將介紹 第1步:sql 語(yǔ)句經(jīng)過(guò) SqlParser 解析成 Unresolved Logical Plan

? 當(dāng)我們執(zhí)行:

val sqlDF = spark.sql("SELECT name FROM people order by name")

? 看一下sql函數(shù):

def sql(sqlText: String): DataFrame = {
    Dataset.ofRows(self, sessionState.sqlParser.parsePlan(sqlText))
  }
def parsePlan(sqlText: String): LogicalPlan

? parsePlan 函數(shù)將 sql語(yǔ)句變成了 LogicalPlan

class SparkSqlParser(conf: SQLConf) extends AbstractSqlParser {
  val astBuilder = new SparkSqlAstBuilder(conf)

  private val substitutor = new VariableSubstitution(conf)

  protected override def parse[T](command: String)(toResult: SqlBaseParser => T): T = {
    super.parse(substitutor.substitute(command))(toResult)
  }
}
/** Creates LogicalPlan for a given SQL string. */
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)
  }
}
protected def parse[T](command: String)(toResult: SqlBaseParser => T): T = {
    logDebug(s"Parsing command: $command")

    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)

    try {
      try {
        // first, try parsing with potentially faster SLL mode
        parser.getInterpreter.setPredictionMode(PredictionMode.SLL)
        toResult(parser)
      }
      catch {
        case e: ParseCancellationException =>
          // if we fail, parse with LL mode
          tokenStream.seek(0) // rewind input stream
          parser.reset()

          // Try Again.
          parser.getInterpreter.setPredictionMode(PredictionMode.LL)
          toResult(parser)
      }
    }
    catch {
      case e: ParseException if e.command.isDefined =>
        throw e
      case e: ParseException =>
        throw e.withCommand(command)
      case e: AnalysisException =>
        val position = Origin(e.line, e.startPosition)
        throw new ParseException(Option(command), e.message, position, position)
    }
  }

? 仔細(xì)閱讀 parse函數(shù),可以發(fā)現(xiàn)其中主要的工作主力是SqlBaseLexer 和 SparkSqlAstBuilder,它們都是antlr4相關(guān)的代碼。下一節(jié)會(huì)對(duì)antlr4進(jìn)行詳細(xì)介紹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本篇文章基于Spark1.6.1源碼解讀Catalyst下的SqlParser spark sql中可以分三種sq...
    海納百川_spark閱讀 1,932評(píng)論 0 2
  • 在前面的文章《spark基礎(chǔ)(上篇)》和《spark基礎(chǔ)(下篇)》里面已經(jīng)介紹了spark的一些基礎(chǔ)知識(shí),知道了s...
    ZPPenny閱讀 22,241評(píng)論 2 36
  • CatalystCatalyst是與Spark解耦的一個(gè)獨(dú)立庫(kù),是一個(gè)impl-free的執(zhí)行計(jì)劃的生成和優(yōu)化框架...
    Codlife閱讀 2,858評(píng)論 0 5
  • 大約在兩年前,我在工作時(shí)遇到過(guò)這樣一個(gè)人。清華大學(xué)計(jì)算機(jī)碩士畢業(yè),曾在好幾家游戲公司帶過(guò)項(xiàng)目,突然有一天看了《游戲...
    發(fā)瘋的然然閱讀 543評(píng)論 0 1

友情鏈接更多精彩內(nèi)容