Spark 数据集相对于 DataFrame 的缺点
Posted
技术标签:
【中文标题】Spark 数据集相对于 DataFrame 的缺点【英文标题】:Disadvantages of Spark Dataset over DataFrame 【发布时间】:2019-03-20 18:48:05 【问题描述】:我知道 Dataset
的优点(类型安全等),但我找不到任何与 Spark 数据集限制相关的文档。
Spark Dataset
是否不推荐而使用DataFrame
更好。
目前我们所有的数据工程流程都使用 Spark (Scala)DataFrame
。
我们希望将Dataset
用于我们所有的新流程。所以了解Dataset
的所有限制/缺点会对我们有所帮助。
编辑:这与Spark 2.0 Dataset vs DataFrame 不同,后者解释了对Dataframe/Dataset 的一些操作。或其他问题,其中大多数解释了 rdd、dataframe 和 dataset 之间的差异以及它们是如何演变的。这是为了了解,何时不使用数据集
【问题讨论】:
这是一个奇怪的问题,因为它是前进的方向。 为什么会这样?应该有一些场景最适合spark dataframes,我们知道DataFrame是Dataset[Row] 无论如何我没有做负1。我不喜欢排。最终ds会占上风。如果我没记错的话,它可以使用 mapPartitions。它也混合了 rdd 的东西。 Spark 2.0 Dataset vs DataFrame Spark 2.0 Dataset vs DataFrame的可能重复 【参考方案1】:在某些情况下,我发现 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,因为这些函数通过创建新列、修改数据集的架构来工作。
一般来说,除非您有充分的理由,否则我认为您不应该从工作 Dataframe 代码迁移到类型化数据集。自 Spark 2.4.0 起,许多 Dataset 功能仍被标记为“实验性”,如上所述,并非所有 Dataframe 功能都具有 Dataset 等价物。
【讨论】:
按等分组怎么样。名称也会丢失。【参考方案2】:Spark 数据集的局限性:
-
数据集used to be less performant(不确定是否已修复)
每次更改Dataset schema时都需要定义一个新的case类,比较麻烦
数据集提供的类型安全性不如您预期的那样多。我们可以向
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|
+------------+----------+-----------+
【讨论】:
以上是关于Spark 数据集相对于 DataFrame 的缺点的主要内容,如果未能解决你的问题,请参考以下文章