SparkSQL(原始碼閱讀三)

2021-09-20 07:50:22 字數 3107 閱讀 8272

額,沒忍住,想完全了解sparksql,畢竟一直在用嘛,想一次性搞清楚它,所以今天再多看點好了~

曾幾何時,有乙個叫做shark的東西,它改了hive的原始碼。。。突然有一天,spark sql突然出現,如下圖:

= =好了,不逗了,言歸正傳。。。那麼一條sql傳統資料庫會是怎麼解析的呢?

傳統資料庫的解析過程是按rusultdata sourceoperation的次序來解析的。傳統資料庫先將讀入的sql語句進行解析,分辨出sql語句中哪些詞是關鍵字(如select,from,where),哪些是表示式,哪些是projection,哪些是data source等等。進一步判斷sql語句是否規範,不規範就報錯,規範則按照下一步過程繫結(bind)。過程繫結是將sql語句和資料庫的資料字典(列,表,檢視等)進行繫結,如果相關的projectiondata source等都存在,就表示這個sql語句是可以執行的。在執行過程中,有時候甚至不需要讀取物理表就可以返回結果,比如重新執行剛執行過的sql語句,直接從資料庫的緩衝池中獲取返回結果。 在資料庫解析的過程中sql語句時,將會把sql語句轉化成乙個樹形結構來進行處理,會形成乙個或含有多個節點(treenode)的tree,然後再後續的處理政對該tree進行一系列的操作。 

然而,spark sql對sql語句的處理和關聯式資料庫對sql語句的解析採用了類似的方法,首先會將sql語句進行解析,然後形成乙個tree,後續如繫結、優化等處理過程都是對tree的操作,而操作方法是採用rule,通過模式匹配,對不同型別的節點採用不同的操作。sparksql有兩個分支,sqlcontext和hivecontext。sqlcontext現在只支援sql語法解析器(catalyst),hivecontext支援sql語法和hivecontext語法解析器。

好了,下來,我們就從sqlcontext開始。

首先,從大神的注釋中,對!是注釋= =中可以看出有一些基本的操作啊~catalog ddl註冊快取表啊,cache table啊,data soreces資料來源啊,配置資訊啊,dataframe建立啊。。我勒個去太多了吧。。。那麼繼續言歸正傳,真個過程呢,查閱資料:

1、sql語句經過sqlparser解析成unresolved logicalplan.

2、使用analyzer結合資料字典(catalog)進行繫結,生成resolved logicalplan.

3、使用optimizerresolved logicalplan進行優化,生成optimized logicalplan.

4、使用sparkplanlogicalplan轉換成physicalplan.

5、使用perpareforexecutionphysicalplan轉換成可執行物理計畫.

6、使用execute()執行可執行物理計畫,生成schemardd.

然後呢,咱乙個方法乙個方法的看~一開始呢,它建立了catalog物件,new 出來了個******catalog,這是個啥呢?

我們深入進去會發現,平時我們用的registertable登錄檔、tableexistsgettables這些都是在這裡搞的啊。。。一開始就將表名與logicalplan一起放入快取tables = newconcurrenthashmap[string,logicalplan]中去。

那麼它的語法解析,treenode中,就封裝了我們所有要呼叫的比如mapflatmapcollect等等等等方法。

再下來。。我就看不懂了。。。第一遍原始碼表太糾結嘛。。。咱慢慢來。。回到sqlcontext,所有的sql入口在這裡,觀察直接是dataframe

曾經應該是schemardd的,現如今直接封裝為dataframe(spark1.6).再往下看。。真的看不懂了。。。是語法解析。。。為了堅持下去先讀通一遍。。我的天~爽虐爽虐的。。後續補充sql解析。。。太晚了看的頭大。。還沒寫一行**。。。

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

String原始碼閱讀(三)

public string split string regex,int limit else if no match was found,return this if off 0 return new string 如果limit大於最大返回長度,上面else中的 不會執行,在此處將最後一段放入l...

STL原始碼閱讀 三

list結點基類 struct list node base list結點 template struct list node public list node base list迭代器,迭代器型別雙向迭代器 struct list iterator base template struct lis...