天天看點

Spark SQL 中 dataFrame 學習總結

dataFrame多了資料的結構資訊。就是schema。

RDD是分布式的 Java對象的集合。DataFrame是分布式的Row對象的集合。

DataFrame 提供了詳細的結構資訊,可以讓sparkSQL清楚的知道資料集中包含哪些列,列的名稱和類型各是什麼?

RDD是分布式的 Java對象的集合。DataFrame是分布式的Row對象的集合。DataFrame除了提供了

比RDD更豐富的算子以外,更重要的特點是提升執行效率、減少資料讀取以及執行計劃的優化,比如

filter下推、裁剪等。

提升執行效率

RDD API是函數式的,強調不變性,在大部分場景下傾向于建立新對象而不是修改老對象。這一特點雖然

帶來了幹淨整潔的API,卻也使得Spark應用程式在運作期傾向于建立大量臨時對象,對GC造成壓力。在

現有RDD API的基礎之上,我們固然可以利用mapPartitions方法來重載RDD單個分片内的資料建立方式

用複用可變對象的方式來減小對象配置設定和GC的開銷,但這犧牲了代碼的可讀性,而且要求開發者對Spark

運作時機制有一定的了解,門檻較高。另一方面,Spark SQL在架構内部已經在各種可能的情況下盡量重

用對象,這樣做雖然在内部會打破了不變性,但在将資料傳回給使用者時,還會重新轉為不可變資料。利

用 DataFrame API進行開發,可以免費地享受到這些優化效果。

減少資料讀取

分析大資料,最快的方法就是 ——忽略它。這裡的“忽略”并不是熟視無睹,而是根據查詢條件進行恰

當的剪枝。

上文讨論分區表時提到的分區剪 枝便是其中一種——當查詢的過濾條件中涉及到分區列時,我們可以根

據查詢條件剪掉肯定不包含目标資料的分區目錄,進而減少IO。

對于一些“智能”資料格 式,Spark SQL還可以根據資料檔案中附帶的統計資訊來進行剪枝。簡單來

說,在這類資料格式中,資料是分段儲存的,每段資料都帶有最大值、最小值、null值數量等 一些基本

的統計資訊。當統計資訊表名某一資料段肯定不包括符合查詢條件的目标資料時,該資料段就可以直接

跳過(例如某整數列a某段的最大值為100,而查詢條件要求a > 200)。

此外,Spark SQL也可以充分利用RCFile、ORC、Parquet等列式存儲格式的優勢,僅掃描查詢真正涉及的

列,忽略其餘列的資料。

Dataset可以認為是DataFrame的一個特例,主要差別是Dataset每一個record存儲的是一個強類型值而不

是一個Row。是以具有如下三個特點:

DataSet可以在編譯時檢查類型

并且是面向對象的程式設計接口

DataFrame是面向sparkSQL的接口。

DataFrame和dataSet可以互相轉化。

df.as[ElementType] 這樣可以把DataFrame轉化為DataSet,

ds.toDF() 這樣可以把DataSet轉化為DataFrame。

繼續閱讀