[英]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 数据集的局限性:
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.