簡體   English   中英

Spark Dataset 相對於 DataFrame 的劣勢

[英]Disadvantages of Spark Dataset over DataFrame

我知道Dataset的優點(類型安全等),但我找不到任何與Spark 數據集限制相關的文檔。

是否有不推薦使用 Spark Dataset而最好使用DataFrame特定場景。

目前我們所有的數據工程流程都使用 Spark (Scala) DataFrame 我們希望將Dataset用於我們所有的新流程。 因此,了解Dataset所有限制/缺點將對我們有所幫助。

編輯:這與Spark 2.0 Dataset vs DataFrame 不同,它解釋了對 Dataframe/Dataset 的一些操作。 或其他問題,其中大多數解釋了 rdd、數據框和數據集之間的差異以及它們是如何演變的。 這是旨在了解何時不使用數據集

在某些情況下,我發現 Dataframe(或 Dataset[Row])比類型化數據集更有用。

例如,當我使用沒有固定模式的數據時,例如 JSON 文件包含具有不同字段的不同類型的記錄。 使用 Dataframe,我可以輕松地“選擇”出我需要的字段,而無需知道整個架構,甚至可以使用運行時配置來指定我將訪問的字段。

另一個考慮是 Spark 可以比 UDAF 和自定義 lambda 更好地優化內置的 Spark SQL 操作和聚合。 因此,如果您想獲得列中某個值的平方根,那是 Spark SQL 中的內置函數( df.withColumn("rootX", sqrt("X")) ),但在 lambda( ds.map(X => Math.sqrt(X)) ) 的效率會降低,因為 Spark 無法有效地優化您的 lambda 函數。

還有許多非類型化的 Dataframe 函數(如統計函數)是為 Dataframes 而不是類型化的 Datasets 實現的,你經常會發現,即使你從一個 Dataset 開始,當你完成聚合時剩下一個 Dataframe,因為這些函數通過創建新列、修改數據集的架構來工作。

一般來說,除非您有充分的理由,否則我認為您不應該從工作數據幀代碼遷移到類型化數據集。 從 Spark 2.4.0 開始,許多 Dataset 功能仍被標記為“實驗性”,並且如上所述,並非所有 Dataframe 功能都具有 Dataset 等效項。

Spark 數據集的局限性:

  1. 數據集過去性能較差(不確定是否已修復)
  2. 每次更改Dataset schema時都需要定義一個新的case類,比較麻煩
  3. 數據集提供的類型安全性沒有你想象的那么高。 我們可以向reverse函數傳遞一個日期對象,它會返回一個垃圾響應而不是出錯。
import java.sql.Date

case class Birth(hospitalName: String, birthDate: Date)

val birthsDS = Seq(
  Birth("westchester", Date.valueOf("2014-01-15"))
).toDS()
birthsDS.withColumn("meaningless", reverse($"birthDate")).show()
+------------+----------+-----------+
|hospitalName| birthDate|meaningless|
+------------+----------+-----------+
| westchester|2014-01-15| 51-10-4102|
+------------+----------+-----------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM