hive原始碼解析之語法解析

2021-06-18 12:40:01 字數 3455 閱讀 4311

hive語法解析器是根據《上次分享的 詞法分析 > 生成的語法樹為基礎,進行語法解析。根據語法token的情況實現了五個具體的語法解析器。

在你生成語法器的時候, semanticanalyze***ctory分別針對不同的情況生成對應的某個語法器,如下

semanticanalyze***ctory類:

現在有五個語法解析器 analyzer繼承了basesemanticanalyzer。

semanticanalyzer

的簡單介紹:

explainsemanticanalyzer

對語法樹、執行計畫 做了乙個列印操作,其他的基本上都是按照semanticanalyzer執行的,最重要的差別,就是在整個解析過程中它沒有讓context在構建檔案真正的臨時檔案所需的檔案及檔案路徑等。

functionsemanticanalyzer :

主要操作是建立和消除乙個的function的元資訊。

如:create temporary function str_to_date as 『com.taobao.hive.udf.udfstrtodate』;

sql可以呼叫該自定義的function。

ddl semanticanalyzer:

主要是對錶、view、partition的級別增刪改查的操作。

如:show tables;

load semanticanalyzer:

load操作。

semanticanalyzer:

對於我們最重要關注的是semanticanalyzer:對應sql語句進行解析,這也是最核心最複雜的元件。

besesemanticanalyze 中語法解析開始於下面:

public voidanalyze(astnode ast, context ctx)throwssemanticexception

關鍵方法:

dophase1()

這個方法相當於把tree的大枝葉先過濾了一遍,解決了一些別名問題和對應為問題,

包括:表和subsql的對應的別名,

tree 的string 與 ast 對應等,只是沒有涉及到字段級別。

1次解析

public voiddophase1(astnode ast, qb qb, phase1ctx ctx_1)

以下是官方注釋。

* phase 1: (including, but not limited to):

inaliastotabs,

aliastosubq

* 2. gets the location of the destination

andnames

theclase

「inclause「+i

* 3. creates a map from a string

representation

ofan

aggregation

tree

tothe

actual

aggregation

ast

* ast』s in aliastolateralviews

這裡是遞迴的遍歷這顆樹,

**示例,如面對 tok_from

casehiveparser.tok_from:

intchild_count = ast.getchildcount();//

if(child_count != 1)else if(frm.gettoken().gettype() == hiveparser.tok_subquery)else if(frm.gettoken().gettype() == hiveparser.tok_lateral_view)else if(isjointoken(frm)) {

processjoin(qb, frm);

qbp.setjoinexpr(frm);

break;

把摘下來的資訊放在qb、qbparseinfo等幾個容器裡面。如:如果是select 就把資訊記錄到qbparseinfo 中。

skiprecursion 標示遞迴是否結束。

其中涉及了幾個容器:

qbparseinfo 是輔助analyzer語法解析的乙個容器,

而qb放的是sql block基本單元,包括表名別名問題。

這裡我們可以拿到很多我們想要的東西。

qbparseinfo

implementation of the parse information related to a query block.

各種對應關係,如: select , groupby , groupby 等的string –map– astnode

private final booleanissubq;

private finalstring alias;

privateastnode joinexpr;

privateastnode hints;

private finalhashmapastnode> aliastosrc;

private finalhashmapastnode> nametodest;

private finalhashmapnametosample;

private finalmapastnode> desttoselexpr;

private finalhashmapastnode> desttowhereexpr;

private finalhashmapastnode> desttogroupby;

context 類在這裡很重要

context : 是query的乙個context

主要功能:

1 標示explain: 如果是explain語句, explain為ture都不會實際的建立這些檔案。

2可以建立tmp-file (在query執行過程中所需要的tmp-file 檔案和路徑 ),生成和清除中間臨時檔案及路徑。

所以我們可以再這裡獲取整個過程中的臨時檔案,用於優化使用。

privatepath makemrscratchdir(hiveconf conf,booleanmkdir)

hive原始碼解析之hive執行過程

儲存到相簿 2014 12 26 23 04 上傳 1.入口 bin cli.sh 呼叫clidriver類進行初始化過程 處理 e,f,h等資訊,如果是 h,列印提示資訊,並退出 讀取hive的配置檔案,設定hiveconf 建立乙個控制台,進入互動模式 2.在互動方式下,讀取每乙個輸命令列,直到...

hive原始碼解析(1)之hive執行過程

1.入口 bin cli.sh 呼叫clidriver類進行初始化過程 處理 e,f,h等資訊,如果是 h,列印提示資訊,並退出 讀取hive的配置檔案,設定hiveconf 建立乙個控制台,進入互動模式 2.在互動方式下,讀取每乙個輸命令列,直到 為止,然後提交給processline cmd 方...

Spring原始碼解析之 Aop原始碼解析(2)

spring aop 更多的是oop開發模式的乙個補充,幫助oop以更好的方式來解決對於需要解決業務功能模組之上統一管理 的功能 以一副圖來做為aop功能的說明更直觀些。對於類似系統的安全檢查,系統日誌,事務管理等相關功能,物件導向的開發方法並沒有更好的解決方法 aop引入了一些概念。更多的是spr...