大數據系列:Spark中 RDD、DataFrame、DataSet的比較

大數據系列:Spark中 RDD、DataFrame、DataSet的比較

1. 目的

今天我們討論下Apache Spark RDD與DataFrame與DataSet 之間的詳細功能比較。我們將簡要介紹Spark API,即RDD,DataFrame和DataSet,以及基於各種功能的這些Spark API之間的區別。例如,數據表示,不變性和互操作性等。我們還將說明在何處使用Spark的RDD,DataFrame API和Dataset API。

瞭解在單節點和多節點集群上安裝Apache Spark的簡單步驟。

2. Apache Spark API – RDD,DataFrame和DataSet

在開始比較Spark RDD,DataFrame和Dataset之前,讓我們看一下Spark中的RDD,DataFrame和Dataset:

  • Spark RDD的API - 一個 RDD代表彈性分佈式數據集。它是記錄的只讀分區集合。RDD是Spark的基本數據結構。它允許程序員以容錯的方式在大型群集上執行內存中計算。因此,加快了任務。
  • Spark Dataframe API – 與RDD不同,數據組織到命名列中。更像一個關係數據庫中的二維表。它是不可變的分佈式數據集合。Spark中的DataFrame允許開發人員將結構強加到分佈式數據集合上,從而實現更高級別的抽象。
  • Spark DataSet API – Apache Spark中的DataSet是DataFrame API的擴展,它提供了類型安全的,面向對象的編程接口。數據集通過將表達式和數據字段公開給查詢計劃者,從而利用了Spark’s Catalyst optimizer。

3. Apache Spark中的RDD與Dataframe與DataSet

現在讓我們瞭解Spark中RDD與DataFrame與DataSet API之間的功能差異:

3.1 Spark 發佈

  • RDD - RDD自Spark 1.0版本的API就一直存在。
  • DataFrames – Spark在Spark 1.3版本中引入了DataFrames。
  • DataSet – Spark在Spark 1.6版本中引入了Dataset。

3.2 數據表示

  • RDD – RDD是分佈在群集中許多計算機上的分佈式數據元素集合。RDD是代表數據的一組Java或Scala對象。
  • DataFrame – DataFrame是組織為命名列的分佈式數據集合。從概念上講,它等於關係數據庫中的表。
  • DataSet – 是DataFrame API的擴展,提供了– RDD API的類型安全的,面向對象的編程接口的功能,以及Catalyst查詢優化器的性能優勢以及DataFrame API的堆外存儲機制。

3.3 數據格式

  • RDD – 它可以輕鬆有效地處理結構化和非結構化數據。但是,與Dataframe和DataSet一樣,RDD不會假設數據的結構,而是要求用戶指定它。
  • DataFrame – 僅適用於結構化和半結構化數據。它在命名列(named columns)中組織數據。DataFrames允許Spark管理Schema。
  • DataSet –它還可以有效地處理結構化和非結構化數據。它以行的JVM對象或行對象的集合的形式表示數據。通過編碼器以表格形式表示。

3.4 數據源API

  • RDD –數據源API允許RDD可以來自任何數據源,例如文本文件, 通過JDBC 的數據庫等,並且可以輕鬆地處理沒有預定義結構的數據。
  • DataFrame –數據源API允許以不同格式(AVRO,CSV,JSON和HDFS,HIVE表,MySQL)處理數據。它可以從上面提到的各種數據源讀取和寫入。
  • DataSet – spark的Dataset API也支持來自不同來源的數據。

3.5 不變性和互操作性

  • RDD – RDD包含已分區記錄的集合。RDD中並行性的基本單位稱為分區。每個分區都是數據的一個邏輯分區,它是不變的,並且是通過對現有分區進行某種轉換而創建的。不變性有助於實現計算的一致性。我們可以通過toDF()方法從RDD移到DataFrame(如果RDD為表格格式),也可以通過.rdd方法進行相反的操作。通過示例學習各種RDD Transformations和Actions API。
  • DataFrame – 轉換為DataFrame後,無法重新生成域對象。例如,如果您從testRDD生成testDF,則將無法恢復測試類的原始RDD。
  • DataSet –克服了DataFrame的侷限性,可以從Dataframe重新生成RDD。DataSet允許您將現有的RDD和DataFrame轉換為數據集。

3.6 編譯時類型安全

  • RDD – RDD提供了熟悉的面向對象的編程風格以及編譯時類型安全性。
  • DataFrame – 在這種情況下,如果您嘗試訪問表中不存在的列,則Dataframe API不支持編譯時錯誤。它僅在運行時檢測屬性錯誤。
  • DataSet – 提供了編譯時類型的安全性。

3.7 優化

  • RDD – RDD中沒有內置的優化引擎。當使用結構化數據時,RDD無法利用sparks高級優化器的優勢。例如,catalyst optimizer 和 Tungsten execution engine引擎。開發人員根據其屬性優化每個RDD。
  • DataFrame –使用 catalyst optimizer進行優化。數據幀在四個階段使用催化劑樹轉換框架:
  • a)分析邏輯計劃以解析引用。
  • b)邏輯計劃優化。
  • c)身體計劃。
  • d)代碼生成,將查詢的一部分編譯為Java字節碼。

下圖還給出了優化階段的簡要概述:

大數據系列:Spark中 RDD、DataFrame、DataSet的比較

  • DataSet – 包含用於優化查詢計劃的Catalyst optimizer 的概念。

3.8 序列化

  • RDD – 每當Spark 需要在群集內分發數據或將數據寫入磁盤時,它都會使用Java序列化。序列化單個Java和Scala對象的開銷非常昂貴,並且需要在節點之間發送數據和結構。
  • DataFrame – Spark DataFrame可以將數據以二進制格式序列化到 off-heap storage存儲(在內存中),然後直接在此堆外內存上執行許多轉換,因為spark可以理解Schema。無需使用Java序列化來編碼數據。它提供了鎢物理執行後端,該後端顯式管理內存並動態生成字節碼以進行表達式計算。
  • DataSet – 關於序列化數據,Spark中的Dataset API具有編碼器的概念,該編碼器處理JVM對象到表格表示形式之間的轉換。它使用Spark內部的二進制格式存儲表格表示形式。數據集允許對序列化數據執行操作並改善內存使用率。它允許按需訪問單個屬性,而無需對整個對象進行滅菌。

3.9 垃圾收集

  • RDD – 創建和銷燬單個對象會導致垃圾回收的開銷。
  • DataFrame – 避免為數據集中的每一行構造單個對象時的垃圾回收成本。
  • DataSet – 垃圾回收器也不需要銷燬對象,因為序列化是通過Tungsten進行的。這使用了堆外數據序列化。

3.10 效率/內存使用

  • RDD – 對Java和Scala對象分別執行序列化會花費很多時間,因此效率會降低。
  • DataFrame – 使用堆外內存進行序列化可減少開銷。它動態生成字節碼,因此可以對該序列化數據執行許多操作。小型操作無需反序列化。
  • DataSet – 它允許對序列化數據執行操作並改善內存使用率。因此,它允許按需訪問單個屬性,而無需反序列化整個對象。

3.11 惰性操作

  • RDD – Spark支持RDD的惰性操作。Transformation操作不會開始真正的計算,只有在執行Action操作的時候Spark才會真正開始計算。轉化操作不會立刻執行,而是在內部記錄下所要執行的操作的相關信息,必要時再執行。
大數據系列:Spark中 RDD、DataFrame、DataSet的比較

  • DataFrame – Spark支持DataFrame的惰性操作,這意味著只有在出現動作(例如顯示結果,保存輸出)時才進行計算。
  • DataSet –Spark也支持惰性操作。

3.12 編程語言支持

  • RDD – RDD API提供Java,Scala,Python和R語言。因此,此功能為開發人員提供了靈活性。
  • DataFrame – 它還具有使用不同語言的API,例如Java,Python,Scala和R。
  • DataSet –數據集API當前僅在Scala和Java中可用。Spark版本2.1.1不支持Python和R。

3.13 Schema Projection

  • RDD – 在RDD API中,顯式使用Schema Projection。因此,我們需要(手動)定義模式。
  • DataFrame – 自動從文件中發現模式,並通過Hive Meta Store獲取數據的Schema。我們這樣做是為了將標準SQL客戶端連接到我們的引擎。並探索我們的數據集,而無需定義文件的Schema。
  • DataSet – 由於使用Spark SQL 引擎,因此自動發現文件的Shema。

3.14。聚合

  • RDD – RDD API執行簡單的分組和聚合操作較慢。
  • DataFrame – DataFrame API非常易於使用。探索性分析速度更快,可在大型數據集上創建彙總統計信息。
  • Dataset – 在Dataset中,對大量Dataset執行聚合操作更快。

3.15。使用範圍

  • RDD-如果要對數據集進行低級轉換和操作,則可以使用RDD。在需要高級抽象時使用RDD。
  • DataFrame和DataSet- 當我們需要高度抽象時,可以同時使用DataFrame和數據集API。 用於非結構化數據,例如媒體流或文本流。 需要特定於域的API時,可以同時使用DataFrame或DataSet。 當您要使用功能編程結構而不是特定於域的表達式來操縱數據時。 我們可以在高級表達式中使用DataFrame或DataFrame。例如,過濾器,映射,聚合,求和,SQL查詢和列訪問。 當您不關心在按名稱或列處理或訪問數據屬性時強加模式(例如列格式)時。 另外,如果我們要在編譯時提高類型安全性。

4。結論

通過RDD與DataFrame與Dataset的比較,很清楚何時使用RDD或DataFrame和/或Dataset。 結果,RDD提供了底層功能和控制。DataFrame和Dataset允許自定義視圖和結構。它提供了針對特定領域的高級操作,節省了空間,並且可以高速執行。從滿足您需求的DataFrames和/或Dataset或RDD API中選擇一種,並使用Spark。

譯自data-flair

如果發現任何不正確的地方,或者想分享有關上述主題的更多信息,歡迎反饋。


分享到:


相關文章: