当前位置: 首页 > 知识库问答 >
问题:

Spark数据集相对于DataFrame的缺点

向安福
2023-03-14

我知道Dataset(类型安全等)的优点,但我找不到任何留档相关的Spark Datasets限制。

是否有任何不建议使用Spark数据集的特定场景,最好使用数据帧。

目前,我们所有的数据工程流都在使用Spark(Scala)数据帧。我们希望在所有新流程中使用数据集。因此,了解数据集的所有限制/缺点将对我们有所帮助。

编辑:这与Spark 2.0 Dataset vs DataFrame不同,后者解释了对Dataframe/Dataset的一些操作。或其他问题,其中大部分解释了rdd、dataframe和数据集之间的差异以及它们是如何演变的。这是为了知道何时不使用数据集


共有2个答案

应向晨
2023-03-14

Spark数据集的局限性:

  1. 数据集过去性能较差(不确定是否已修复)
  2. 每当更改Dataset架构时,都需要定义一个新的case类,这很麻烦
  3. 数据集没有提供您预期的类型安全性。我们可以将反向函数传递给日期对象,它会返回垃圾响应而不是错误。
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|
+------------+----------+-----------+
蒲昊
2023-03-14

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

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

另一个需要考虑的问题是,与UDAFs和自定义lambda相比,Spark可以更好地优化内置的Spark SQL操作和聚合。因此,如果要获取列中某个值的平方根,这是Spark SQL中的一个内置函数(df.withColumn(“rootX”,sqrt(“X”))),但它是在lambda(ds.map(X))中进行的=

还有许多未类型化的数据框函数(如统计函数)是为数据框实现的,但不是类型化的数据集,您经常会发现,即使您从数据集开始,当您完成聚合时,您只剩下数据框,因为这些函数通过创建新列、修改数据集的模式来工作。

一般来说,我认为您不应该从工作Dataframe代码迁移到类型化数据集,除非您有充分的理由。从Spark 2.4.0开始,许多数据集功能仍被标记为“实验性”,如上所述,并非所有Dataframe功能都具有数据集等价物。

 类似资料:
  • 问题内容: 我想知道是否有任何方法可以指定例如明天作为DBUnit XML数据集中的日期。有时,代码逻辑对于将来的日期和过去的日期是不同的,我想测试两种情况。可以肯定地说,我可以指定类似2239年11月5日这样的名称,并确保测试可以一直进行到此日期,但是还有更优雅的方法。 在Java开发期间,我还没有遇到过这种情况,但是有一次我经历过代码逻辑在日期前一天,日期前两天以及日期前两天以上不同的情况。在

  • 问题内容: 当我仔细观察时,我唯一提出的疑问是: 找不到适用于实际参数“ org.apache.spark.unsafe.types.UTF8String”的适用构造函数/方法;候选者为:“ public void sparkSQL.Tweet.setId(long)” 问题答案: 正如@ user9718686所写,id字段具有不同的类型:在json文件和类定义中。当您将其读入时,Spark会从

  • 我在RDBMS中有几个数据库表,在当前的逻辑中,所有这些表都被连接起来并给出一些数据,基本上SQL被存储为视图的一部分。使用sqoop将数据推送到HDFS中,需要应用一些分组和按操作排序。 什么可能是连接数据集的最佳方式,如转储所需的列到内存(如df.registeredTempTable())和应用连接,或者我可以使用数据集连接,因为数据在HDFS的不同文件中可用。 问候阿南

  • 我正在评估将现有的RDD代码替换为Dataset。对于我的一个用例,我无法将数据集映射到另一个用例类。 以下是我想做的。。。 任何帮助都将不胜感激。 但以下例外情况:

  • 我需要根据一些共享的键列将许多数据帧连接在一起。对于键值RDD,可以指定一个分区程序,以便具有相同键的数据点被洗牌到相同的执行器,因此连接更有效(如果在之前有与洗牌相关的操作)。可以在火花数据帧或数据集上做同样的事情吗?

  • 本文向大家介绍对dataframe数据之间求补集的实例详解,包括了对dataframe数据之间求补集的实例详解的使用技巧和注意事项,需要的朋友参考一下 python的pandas库,对于dataframe数据,有merge命令可以完成dataframe数据之间的求取交集并集等命令。 若存在df1与df2 ,他们的交集df3=pd.merge(df1,df2,on=[.....])。但是又想通过df