1. 程式人生 > >spark中RDD,DataSet,DataFrame的區別

spark中RDD,DataSet,DataFrame的區別

接觸到spark不可避免的會接觸spark的Api;

          rdd,DataFrame,DataSet,

接下來就大致說一下他們的有點以及各自的區別;

首先DataFrame,DataSet是基於RDD之上的,而且可以通過簡單的api呼叫進行無縫切換。

RDD的優點;

1;相對比與傳統的MapReduce框架,spark的RDD中內建了很多函式操作,map,flatMap,filter等運算元,方便處理結構化和非結構化的資料。

2;面向物件程式設計,直接儲存java物件,型別轉化也很安全。

RDD的缺點;

1;存在大量的序列化和反序列化的效能開銷,因為無論是叢集間通訊還是IO操作都是需要進行序列化和反序列化的。

2;並沒有對特殊場景進行優化,比如對於結構化資料,以及sql的操作就很乏力。

3;GC效能的開銷,基於記憶體計算,頻繁的建立和銷燬物件,勢必會增加GC。

接下來說DataFrame

優點;

1;DataFrame是sparkSql的APi,在RDD的基礎之上又引入了schema和off-heap;

schema;RDD中的每一行的資料,結構都是一樣的,這個結構就儲存在schema中,spark通過schema就可以讀懂資料,因此在通訊和IO的過程中只需要進行序列化和反序列化,而結構的部分就可以省略了。

off-heap;意味著開始使用堆外記憶體,這些記憶體直接受作業系統管理,而不是由jvm管理,spark能夠以二進位制的形式序列化資料,此處不包含結構,要操作資料的時候只需要直接操作off-heap記憶體即可,由於spark理解schema,所以知道怎麼去操作,而且將資料儲存在堆外,減少了gc次數,所以執行更快。

通過schema和off-heap, DataFrame解決了RDD的缺點, 但是卻丟了RDD的優點. DataFrame不是型別安全的, API也不是面向物件風格的.

2;結構化資料的處理非常方便,支援json,parquent等kv資料,也支援hive,mysql等傳統資料庫

3;對hive的相容,支援hsql,udf,udaf等

缺點;

1;在編譯時不能做型別轉換的安全檢查,只有在執行期在能確定是否存在問題

2;對於物件支援不友好,RDD內部資料直接以java物件方式儲存,而DataFrame記憶體儲存的是row物件,而不是自定義物件。

 

最後是DataSet;

優點;

1;DataSet整合了dataFrame,RDD的優點,支援結構化和非結構化的資料

2;和RDD一樣,支援自定義物件儲存

3;和DataFrame一樣,支援結構化資料的sql查詢

4,採用堆外記憶體,gc友好

5;型別轉化安全,程式碼友好。

6;一個新的概念Encoder;

  當序列化資料的時候Encoder會產生位元組碼與off-heap進行互動,能夠達到按需訪問資料的效果,而不需要反序列化整個物件

 

最後一個;如何選擇RDD,還是DataFrame/DataSet呢?

RDD提供低級別的功能和更多的控制,

而DataFrame和DataSet允許自定義檢視和結構,提供高階和特定領域的操作,節省空間,並能夠以極高的速度執行