spark sql parse 過程

  1. spark sql parse 引擎

    • ANTLR(ANother Tool for Language Recognition)绞愚,kudu眠寿、presto、hive 都是用 ANTLR 解析 sql 語句锌半。
    • ANTLR 提供了兩種機(jī)制來訪問生成的語法樹:Listener 和 Visitor, spark sql 使用的是 Visitor 模式搂抒,具體實(shí)現(xiàn)類為: SqlBaseVisitor, Hive 好像使用的是 Listener 模式
  2. antlr4 的使用需要定義一個(gè)語法文件弥臼,spark sql 的語法文件的路徑在


    image.png
    • antlr 會(huì)根據(jù)上面定義的 sqlBase.g4 生成語法解析(SqlBaseParser) 和詞法解析器(SqlBaseLexer)


      image.png
  3. spark sql 的解析是 SparkSqlParser 完成的
    SparkSqlParse 繼承自 AbstractSqlParser 抽象類,抽象類中提供了一個(gè) parsePlan 方法執(zhí)行具體的解析過程

  /**
   * 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)
    }
  }
  • 上述 parsePlan 的方法入?yún)⑹?String 類型的 sqlText宴咧,方法返回值為 LogicalPlan, 這個(gè)方法的調(diào)用完成了輸入 sql 語句到 logicalPlan 的轉(zhuǎn)化
  • 調(diào)用 astBuilder.visitSingleStatement 使用 ANTLR 的 Vistor 模式遍歷 Tree,將antlr里面的節(jié)點(diǎn)都替換成 catalyst 里面的類型径缅,所有的類型都繼承抽象類 TreeNode掺栅,TreeNode又有子節(jié)點(diǎn)children: Seq[BaseType]烙肺,組織成了樹的結(jié)構(gòu)。
  1. spark sql parse 解析案例

    1. 輸入 sql: SELECT name,age FROM people WHERE age > 10 group by 1,2

    2. 經(jīng)過 parsePlan 解析出來的 Logical plan氧卧,輸出如下:

      == Parsed Logical Plan ==
      'Aggregate [1, 2], ['name, 'age]
      +- 'Filter ('age > 10)
         +- 'UnresolvedRelation `people`
      
    3. 通過設(shè)置斷點(diǎn)可以看到


      image.png

      解析出來的 logical plan 的 schema 還沒有形成

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桃笙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沙绝,更是在濱河造成了極大的恐慌搏明,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闪檬,死亡現(xiàn)場離奇詭異星著,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)粗悯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門虚循,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人样傍,你說我怎么就攤上這事横缔。” “怎么了衫哥?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵茎刚,是天一觀的道長。 經(jīng)常有香客問我撤逢,道長膛锭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任蚊荣,我火速辦了婚禮泉沾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妇押。我一直安慰自己,他們只是感情好姓迅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布敲霍。 她就那樣靜靜地躺著,像睡著了一般丁存。 火紅的嫁衣襯著肌膚如雪肩杈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天解寝,我揣著相機(jī)與錄音扩然,去河邊找鬼。 笑死聋伦,一個(gè)胖子當(dāng)著我的面吹牛夫偶,可吹牛的內(nèi)容都是我干的界睁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼兵拢,長吁一口氣:“原來是場噩夢啊……” “哼翻斟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起说铃,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤访惜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后腻扇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體债热,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年幼苛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窒篱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚓峦,死狀恐怖舌剂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暑椰,我是刑警寧澤霍转,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站一汽,受9級(jí)特大地震影響避消,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜召夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一岩喷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧监憎,春花似錦纱意、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褐筛,卻和暖如春类少,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渔扎。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工硫狞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓残吩,卻偏偏與公主長得像财忽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子世剖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容