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允許自定義檢視和結構,提供高階和特定領域的操作,節省空間,並能夠以極高的速度執行