當前位置:編程學習大全網 - 源碼下載 - 談談RDD,DataFrame,Dataset的區別和各自的優勢

談談RDD,DataFrame,Dataset的區別和各自的優勢

RDD、DataFrame和DataSet是容易產生混淆的概念,必須對其相互之間對比,才可以知道其中異同。

RDD和DataFrame

RDD-DataFrame

上圖直觀地體現了DataFrame和RDD的區別。左側的RDD[Person]雖然以Person為類型參數,但Spark框架本身不了解

Person類的內部結構。而右側的DataFrame卻提供了詳細的結構信息,使得Spark

SQL可以清楚地知道該數據集中包含哪些列,每列的名稱和類型各是什麽。DataFrame多了數據的結構信息,即schema。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等列式存儲格式的優勢,僅掃描查詢真正涉及的列,忽略其余列的數據。

  • 上一篇:我想在東營開壹家代駕的公司,需要什麽手續,需要做些什麽?
  • 下一篇:OA辦公系統怎樣實現高效的辦公用品管理平臺
  • copyright 2024編程學習大全網