2016-02-16 56 views
8

我還在努力理解最近推出的Spark Datasets的全部功能。Spark DataSet和RDD有什麼區別

是否存在何時使用RDD以及何時使用數據集的最佳做法?

在他們的announcement Databricks解釋說,通過使用數據集可以實現運行時間和內存的大幅減少。儘管如此,還是聲稱數據集的設計與現有的RDD API一起工作。

這只是對向下兼容性的參考,或者是否有情況下人們更喜歡使用數據集上的RDD?

+0

檢查這個環節也:https://開頭計算器。com/a/45253013/1592191 – mrsrinivas

回答

14

此刻(Spark 1.6.0)DataSet API只是一個預覽版,只實現了一小部分功能,因此無法告訴任何有關最佳實踐的內容。

概念星火DataSet只是一個DataFrame額外的類型安全(或者,如果你喜歡a glance at the futureDataFrameDataSet[Row])。這意味着你得到了所有的benefits of CatalystTungsten。它包括邏輯和物理計劃優化,矢量化操作和低級內存管理。

你鬆動的是靈活性和透明度。

首先,您的數據必須經過編碼,然後才能與DataSet一起使用。 Spark爲原始類型和產品/案例類提供編碼器,至今爲止,定義自定義序列化所需的API不可用。它很可能與UDT API相似(請參閱例如How to define schema for custom type in Spark SQL?Serialize/Deserialize existing class for spark sql dataframe)及其所有問題。它比較冗長,需要額外的努力,並且對於複雜的對象而言可能變得非常明顯。此外,它觸及了API的一些較低層次的方面,這些方面沒有很好的記錄。

關於透明度,它與在典型的RDBMS中與規劃者相同的問題。這很好,直到它不是。這是一個了不起的工具,它可以分析你的數據,做出明智的轉換,但是作爲任何工具,它可能會走錯路,並留下盯着執行計劃,並試圖找出如何使事情工作。

基於預覽,我會說它可以放在DataFrame API和RDD API之間的某處。它比DataFrames更靈活,但仍提供了類似的優化,非常適合一般數據處理任務。它沒有提供與RDD API相同的靈活性(至少沒有更深入地介紹Catalyst內部)。

另一個區別是,它在這個時候只是假設,是它與客戶語言(R,Python)交互的一種方式。與DataFrame類似,DataSet屬於JVM。這意味着任何可能的交互都可以屬於以下兩類之一:本機JVM操作(如DataFrame表達式)和來賓方代碼(如Python UDF)。不幸的是,第二部分需要在JVM和訪客環境之間進行昂貴的往返。

參見:

+1

非常感謝您的詳細解答! –