
什麼是Spark SQL?
Spark SQL是Spark用來處理結構化資料的一個子產品,它提供了2個程式設計抽象:DataFrame和DataSet,并且作為分布式SQL查詢引擎的作用。
我們已經學習了Hive,它是将Hive SQL轉換成MapReduce然後送出到叢集上執行,大大簡化了編寫MapReduc的程式的複雜性,由于MapReduce這種計算模型執行效率比較慢。所有Spark SQL的應運而生,它是将Spark SQL轉換成RDD,然後送出到叢集執行,執行效率非常快!
Spark SQL的特點
1)易整合
2)統一的資料通路方式
3)相容Hive
4)标準的資料連接配接
什麼是DataFrame?
與RDD類似,DataFrame也是一個分布式資料容器。然而DataFrame更像傳統資料庫的二維表格,除了資料以外,還記錄資料的結構資訊,即schema。
同時,與Hive類似,DataFrame也支援嵌套資料類型(struct、array和map)。從API易用性的角度上看,DataFrame API提供的是一套高層的關系操作,比函數式的RDD API要更加友好,門檻更低。
上圖直覺地展現了DataFrame和RDD的差別。左側的RDD[Person]雖然以Person為類型參數,但Spark架構本身不了解Person類的内部結構。而右側的DataFrame卻提供了詳細的結構資訊,使得Spark SQL可以清楚地知道該資料集中包含哪些列,每列的名稱和類型各是什麼。
DataFrame是為資料提供了Schema的視圖。可以把它當做資料庫中的一張表來對待,DataFrame也是懶執行的。性能上比RDD要高,主要原因:
優化的執行計劃:查詢計劃通過Spark catalyst optimiser(Spark的優化器)進行優化。
比如下面一個例子:
為了說明查詢優化,我們來看上圖展示的人口資料分析的示例。圖中構造了兩個DataFrame,将它們join之後又做了一次filter操作。如果原封不動地執行這個執行計劃,最終的執行效率是不高的。因為join是一個代價較大的操作,也可能會産生一個較大的資料集。如果我們能将filter下推到 join下方,先對DataFrame進行過濾,再join過濾後的較小的結果集,便可以有效縮短執行時間。而Spark SQL的查詢優化器正是這樣做的。
簡而言之,邏輯查詢計劃優化就是一個利用基于關系代數的等價變換,将高成本的操作替換為低成本操作的過程。
什麼是DataSet?
1)是Dataframe API的一個擴充,是Spark最新的資料抽象。
2)使用者友好的API風格,既具有類型安全檢查也具有Dataframe的查詢優化特性。
3)Dataset支援編解碼器,當需要通路非堆上的資料時可以避免反序列化整個對象,提高了效率。
4)樣例類被用來在Dataset中定義資料的結構資訊,樣例類中每個屬性的名稱直接映射到DataSet中的字段名稱。