Spark Dataset优于DataFrame的缺点

时间:2019-03-20 18:48:05

标签: apache-spark

我知道Dataset的优点(类型安全性等),但是我找不到与 Spark数据集限制相关的任何文档。

在某些特定情况下,不推荐使用Spark Dataset ,最好使用DataFrame

当前,我们所有的数据工程流程都在使用Spark(Scala)DataFrame。 对于所有新流程,我们都想使用Dataset。因此,了解Dataset的所有局限/缺点将对我们有所帮助。

编辑:这与Spark 2.0 Dataset vs DataFrame不同,后者说明了对数据框/数据集的一些操作。或其他问题,其中大多数解释了rdd,数据框和数据集之间的差异以及它们的演变方式。旨在了解何时不使用数据集

2 个答案:

答案 0 :(得分:1)

在某些情况下,我发现Dataframe(或Dataset [Row])比类型化的数据集更有用。

例如,当我使用没有固定模式的数据时,例如JSON文件,其中包含具有不同字段的不同类型的记录。使用数据框,我可以轻松地“选择”所需的字段,而无需了解整个架构,甚至可以使用运行时配置指定我要访问的字段。

另一个考虑因素是,与UDAF和自定义lambda相比,Spark可以更好地优化内置的Spark SQL操作和聚合。因此,如果要在列中获取值的平方根,则这是Spark SQL中的内置函数(df.withColumn("rootX", sqrt("X"))),但在lambda(ds.map(X => Math.sqrt(X)))中执行则效率较低,因为Spark无法有效地优化您的lambda函数。

还有许多为数据框实现的非类型化Dataframe函数(例如统计函数),但没有类型化的Dataset,并且您通常会发现,即使从Dataset开始,在完成聚合时您留下了一个数据框,因为这些功能通过创建新列,修改数据集的架构来起作用。

通常,除非您有充分的理由,否则我不认为您应该从工作的Dataframe代码迁移到键入的数据集。自Spark 2.4.0起,许多数据集功能仍被标记为“实验性”,如上所述,并非所有数据框功能都具有等效的数据集。

答案 1 :(得分:1)

Spark 数据集的局限性:

  1. 数据集 used to be less performant(不确定是否已修复)
  2. 每当更改Dataset架构时都需要定义一个新的案例类,这很麻烦
  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|
+------------+----------+-----------+