Spark Dataset相较于DataFrame的缺点

17

我了解Dataset的优势(如类型安全等),但是我找不到任何与Spark Datasets Limitations相关的文档。

是否有特定场景下,建议不使用 Spark Dataset 而改用 DataFrame

目前我们所有的数据工程流程都使用 Spark (Scala) DataFrame。 我们想利用 Dataset 来完成所有新的流程。因此了解 Dataset 的所有限制和缺点将对我们有所帮助。

编辑:这并不类似于Spark 2.0 Dataset vs DataFrame,它解释了一些关于Dataframe / Dataset的操作,或者其他问题,其中大部分解释了rdd、dataframe和dataset之间的差异以及它们的发展历程。这是针对知道什么时候不使用Datasets


这是一个奇怪的问题,因为这是前进的方式。 - thebluephantom
为什么呢?肯定有一些情况适合使用Spark DataFrames,我们知道DataFrame是Dataset[Row]。 - Ranga Vure
无论如何,我没有减1。我不是行的粉丝。最终,DS将会占优势。如果我没记错的话,它可以使用mapPartitions。它也混合了RDD的内容。 - thebluephantom
Spark 2.0 Dataset与DataFrame的区别 - 10465355
可能是Spark 2.0 Dataset vs DataFrame的重复问题。 - Raphael Roth
2个回答

13

在一些场景下,我会发现Dataframe(或Dataset [Row])比类型化的数据集更有用。

例如,当我处理没有固定模式的数据时,比如包含不同类型和字段的记录的JSON文件。使用Dataframe,我可以轻松地“选择”所需的字段,而无需知道整个模式,甚至可以使用运行时配置指定要访问的字段。

另一个考虑因素是,Spark可以更好地优化内置的Spark SQL操作和聚合,而不是UDAF和自定义Lambda。因此,如果您想要获取列中值的平方根,那么在Spark SQL中使用内置函数(df.withColumn("rootX", sqrt("X")))就可以了,但是在Lambda中实现它(ds.map(X => Math.sqrt(X)))效率会更低,因为Spark无法像优化内置函数那样有效地优化您的Lambda函数。

还有许多未经过类型化的Dataframe函数(如统计函数),这些函数已经实现为Dataframe,而不是类型化的Datasets,您可能会发现即使您开始使用Dataset,通过完成聚合后您也会转换成为Dataframe,因为这些函数通过创建新列,修改数据集的模式来工作。

通常情况下,我认为你不应该从已经正常工作的DataFrame代码迁移到类型化的Dataset,除非你有充分的理由。截至Spark 2.4.0版本,许多Dataset功能仍被标记为“实验性”,并且像上面所提到的,并不是所有DataFrame功能都有与之相对应的Dataset版本。


2
分组等问题怎么样?名称也会丢失。 - thebluephantom
2022年是否有任何新的见解?对我来说,数据集已经足够成熟,可以用作安全网,证明您的输入和输出,但出于性能/可读性原因,您应该在函数内部使用数据框。 - Double Sept

1

Spark数据集的限制:

  1. 数据集曾经性能较差(不确定是否已经修复)
  2. 每当更改数据集模式时,都需要定义一个新的Case Class,这很麻烦
  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|
+------------+----------+-----------+

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接