SparkSQL RDD,DataFrame,DataSet三者的區別與聯繫

推薦大家去看原文博主的文章,條理清晰閱讀方便,轉載是爲了方便以後個人查閱

https://www.jianshu.com/p/c3b262349226

1.RDD

優點

        1.1 編譯時類型安全;

        1.2 編譯時就能檢查出類型錯誤;

        1. 3 面向對象的編程風格;

        1.4 直接通過類名點的方式來操作數據
缺點

        1.1序列化和反序列化的性能開銷;

        1.2無論是集羣間的通信,還是IO操作都需要對對象的結構和數據進行序列化和反序列化;

        1.3GC的性能開銷,頻繁的創建和銷燬對象,勢必會增加GC

2.DataFrame

DataFrame引入了schema和off-heap
schema:RDD每一行的數據結構都是一樣的,這個結構就存儲在schema中,spark通過schema就能夠讀懂數據,因此在通信和IO時就只需要序列化和反序列化數據,而結構的部分就可以省略了。
off-heap:意味着JVM堆以外的內存,這些內存直接受操作系統管理(而不是JVM)。spark能夠以二進制的形式序列化數據到off-heap中,當要操作數據時,就直接操作off-heap內存。由於spark理解schema,所以知道該如何操作。
off-heap就像底盤,schema就像地圖,spark有地圖又有底盤,就可以自己說了算了,不再受JVM的限制,也就不再受GC的困擾了。
通過schema和off-heap,DataFrame解決了RDD的缺點,卻丟了RDD的有點,DataFrame不是類型安全的,API也不是面向對象風格的。


3.Dataset

Dataset結合了RDD和DataFrame的優點,並帶來一個新的概念Encoder。
當序列化數據時,Encoder產生字節碼與off-heap進行交互,能夠達到按需訪問數據的效果,而不用反序列化整個對象。spark還沒有提供自定義Encoder的API,未來會加入。


4.RDD和Dataset

Dataset以Catalyst邏輯執行計劃表示,並且數據以編碼的二進制形式被存儲,不需要反序列化就可以執行sorting、shuffle等操作。
Dataset創立需要一個顯式的Encoder,把對象序列化爲二進制,可以把對象的schema映射爲sparkSQL類型,然而RDD依賴於運行時反射機制。
Dataset比RDD性能要好很多。


5.DataFrame和Dataset

Dataset可以認爲是DataFrame的一個特例,主要區別是Dataset每一個record存儲的是一個強類型而不是一個Row,因此具有如下三個特點:
               5.1 Dataset可以在編譯時檢查類型
               5.2 Dataset是面向對象的編程接口
               5.3 後面版本DataFrame會繼承DataSet,DataFrame是面向Spark SQL的接口。
DataFrame和Dataset可以相互轉化,df.as[ElementType]這樣可以把DataFrame轉化爲Dataset,ds.toDF()這樣可以把Dataset轉化爲DataFrame.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章