Spark RDD与DataFrame
?
1. DataFrame概念
DataFrame的前身是SchemaRDD,從Spark 1.3.0開始SchemaRDD更名為DataFrame。與SchemaRDD的主要區別是:DataFrame不再直接繼承自RDD,而是自己實現了RDD的絕大多數功能。你仍舊可以在DataFrame上調用rdd方法將其轉換為一個RDD。
在Spark中,DataFrame是一種以RDD為基礎的分布式數據集,類似于傳統數據庫的二維表格,DataFrame帶有Schema元信息,即DataFrame所表示的二維表數據集的每一列都帶有名稱和類型,但底層做了更多的優化。DataFrame可以從很多數據源構建,比如:已經存在的RDD、結構化文件、外部數據庫、Hive表。
2. DataFrame與RDD的區別
RDD可看作是分布式的對象的集合,Spark并不知道對象的詳細模式信息,DataFrame可看作是分布式的Row對象的集合,其提供了由列組成的詳細模式信息,使得Spark SQL可以進行某些形式的執行優化。
DataFrame和普通的RDD的邏輯框架區別如下所示:
左側的RDD[Person]雖然以Person為類型參數,但Spark框架本身不了解 Person類的內部結構。
而右側的DataFrame卻提供了詳細的結構信息,使得Spark SQL可以清楚地知道該數據集中包含哪些列,每列的名稱和類型各是什么。DataFrame多了數據的結構信息,即schema。這樣看起來就像一張表了,DataFrame還配套了新的操作數據的方法,DataFrame API(如df.select())和SQL(select id, name from xx_table where …)。
此外DataFrame還引入了off-heap,意味著JVM堆以外的內存, 這些內存直接受操作系統管理(而不是JVM)。Spark能夠以二進制的形式序列化數據(不包括結構)到off-heap中, 當要操作數據時, 就直接操作off-heap內存. 由于Spark理解schema, 所以知道該如何操作。
RDD是分布式的Java對象的集合。DataFrame是分布式的Row對象的集合。DataFrame除了提供了比RDD更豐富的算子以外,更重要的特點是提升執行效率、減少數據讀取以及執行計劃的優化。
有了DataFrame這個高一層的抽象后,我們處理數據更加簡單了,甚至可以用SQL來處理數據了,對開發者來說,易用性有了很大的提升。
不僅如此,通過DataFrame API或SQL處理數據,會自動經過Spark 優化器(Catalyst)的優化,即使你寫的程序或SQL不高效,也可以運行的很快。
3. DataFrame與RDD的優缺點
RDD的優缺點:?
優點:
- 編譯時類型安全?
編譯時就能檢查出類型錯誤 - 面向對象的編程風格?
直接通過類名點的方式來操作數據
缺點:
- 序列化和反序列化的性能開銷?
無論是集群間的通信, 還是IO操作都需要對對象的結構和數據進行序列化和反序列化。 - GC的性能開銷?
頻繁的創建和銷毀對象, 勢必會增加GC
DataFrame通過引入schema和off-heap(不在堆里面的內存,指的是除了不在堆的內存,使用操作系統上的內存),解決了RDD的缺點, Spark通過schame就能夠讀懂數據, 因此在通信和IO時就只需要序列化和反序列化數據, 而結構的部分就可以省略了;通過off-heap引入,可以快速的操作數據,避免大量的GC。但是卻丟了RDD的優點,DataFrame不是類型安全的, API也不是面向對象風格的。
總結
以上是生活随笔為你收集整理的Spark RDD与DataFrame的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark SQL程序实现RDD转换Da
- 下一篇: Spark 运行机制