額,沒忍住,想完全了解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 出來了個SimpleCatalog,這是個啥呢?
我們深入進去會發現,平時我們用的registerTable系統資料庫、tableExists、getTables這些都是在這裡搞的啊。。。一開始就将表名與LogicalPlan一起放入緩存tables = new ConcurrentHashMap[String,LogicalPlan]中去。
那麼它的文法解析,treeNode中,就封裝了我們所有要調用的比如map、flatMap、collect等等等等方法。
再下來。。我就看不懂了。。。第一遍源碼表太糾結嘛。。。咱慢慢來。。回到sqlContext,所有的sql入口在這裡,觀察直接是DataFrame
曾經應該是SchemaRDD的,現如今直接封裝為DataFrame(spark1.6).再往下看。。真的看不懂了。。。是文法解析。。。為了堅持下去先讀通一遍。。我的天~爽虐爽虐的。。後續補充sql解析。。。太晚了看的頭大。。還沒寫一行代碼。。。
參考文獻:《深入了解Spark核心思想與源碼解析》