我知道Dataset
的优点(类型安全性等),但是我找不到与 Spark数据集限制相关的任何文档。
在某些特定情况下,不推荐使用Spark Dataset
,最好使用DataFrame
。
当前,我们所有的数据工程流程都在使用Spark(Scala)DataFrame
。
对于所有新流程,我们都想使用Dataset
。因此,了解Dataset
的所有局限/缺点将对我们有所帮助。
编辑:这与Spark 2.0 Dataset vs DataFrame不同,后者说明了对数据框/数据集的一些操作。或其他问题,其中大多数解释了rdd,数据框和数据集之间的差异以及它们的演变方式。旨在了解何时不使用数据集
答案 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 数据集的局限性:
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|
+------------+----------+-----------+