SparkSQL(源碼閱讀三)

  額,沒忍住,想徹底瞭解sparksql,畢竟一直在用嘛,想一次性搞清楚它,因此今天再多看點好了~sql

  曾幾什麼時候,有一個叫作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語法解析器。spa

好了,下來,咱們就從sqlContext開始。3d

  首先,從大神的註釋中,對!是註釋= =中能夠看出有一些基本的操做啊~catalog DDL註冊緩存表啊,cache Table啊,Data soreces數據源啊,配置信息啊,DataFrame建立啊。。我勒個去太多了吧。。。那麼繼續言歸正傳,真個過程呢,查閱資料:對象

  一、SQL語句通過SqlParser解析成Unresolved LogicalPlan.blog

  二、使用analyzer結合數據字典(catalog)進行綁定,生成Resolved LogicalPlan.get

  三、使用optimizerResolved LogicalPlan進行優化,生成Optimized LogicalPlan.源碼

  四、使用SparkPlanLogicalPlan轉換成PhysicalPlan.

  五、使用perpareForExecutionPhysicalPlan轉換成可執行物理計劃.

  六、使用execute()執行可執行物理計劃,生成SchemaRDD.

  而後呢,咱一個方法一個方法的看~一開始呢,它建立了catalog對象,new 出來了個SimpleCatalog,這是個啥呢?

  咱們深刻進去會發現,平時咱們用的registerTable註冊表、tableExistsgetTables這些都是在這裏搞的啊。。。一開始就將表名與LogicalPlan一塊兒放入緩存tables = new ConcurrentHashMap[String,LogicalPlan]中去。

  那麼它的語法解析,treeNode中,就封裝了咱們全部要調用的好比mapflatMapcollect等等等等方法。

  

  再下來。。我就看不懂了。。。第一遍源碼錶太糾結嘛。。。咱慢慢來。。回到sqlContext,全部的sql入口在這裏,觀察直接是DataFrame

  

  曾經應該是SchemaRDD的,現現在直接封裝爲DataFrame(spark1.6).再往下看。。真的看不懂了。。。是語法解析。。。爲了堅持下去先讀通一遍。。個人天~爽虐爽虐的。。後續補充sql解析。。。太晚了看的頭大。。還沒寫一行代碼。。。

  參考文獻:《深刻理解Spark核心思想與源碼解析》

相關文章
相關標籤/搜索