額,沒忍住,想完全了解sparksql,畢竟一直在用嘛,想一次性搞清楚它,所以今天再多看點好了~
曾幾何時,有乙個叫做shark的東西,它改了hive的原始碼。。。突然有一天,spark sql突然出現,如下圖:
= =好了,不逗了,言歸正傳。。。那麼一條sql傳統資料庫會是怎麼解析的呢?
傳統資料庫的解析過程是按rusult、data source、operation的次序來解析的。傳統資料庫先將讀入的sql語句進行解析,分辨出sql語句中哪些詞是關鍵字(如select,from,where),哪些是表示式,哪些是projection,哪些是data source等等。進一步判斷sql語句是否規範,不規範就報錯,規範則按照下一步過程繫結(bind)。過程繫結是將sql語句和資料庫的資料字典(列,表,檢視等)進行繫結,如果相關的projection、data 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、使用optimizer對resolved logicalplan進行優化,生成optimized logicalplan.
4、使用sparkplan將logicalplan轉換成physicalplan.
5、使用perpareforexecution將physicalplan轉換成可執行物理計畫.
6、使用execute()執行可執行物理計畫,生成schemardd.
然後呢,咱乙個方法乙個方法的看~一開始呢,它建立了catalog物件,new 出來了個******catalog,這是個啥呢?
我們深入進去會發現,平時我們用的registertable登錄檔、tableexists、gettables這些都是在這裡搞的啊。。。一開始就將表名與logicalplan一起放入快取tables = newconcurrenthashmap[string,logicalplan]中去。
那麼它的語法解析,treenode中,就封裝了我們所有要呼叫的比如map、flatmap、collect等等等等方法。
再下來。。我就看不懂了。。。第一遍原始碼表太糾結嘛。。。咱慢慢來。。回到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...