apache-spark - Spark Dataset 优于 DataFrame 的缺点
问题描述
我知道Dataset
(类型安全等)的优点,但我找不到任何与Spark Datasets Limitations相关的文档。
Dataset
是否存在不推荐使用 Spark而更好用的特定场景DataFrame
。
目前我们所有的数据工程流程都在使用 Spark (Scala) DataFrame
。我们希望将Dataset
, 用于我们所有的新流程。因此,了解所有限制/缺点Dataset
将对我们有所帮助。
编辑:这与Spark 2.0 Dataset vs DataFrame 不同,后者解释了对 Dataframe/Dataset 的一些操作。或其他问题,其中大多数解释了 rdd、dataframe 和 dataset 之间的差异以及它们是如何演变的。这是为了知道什么时候不使用数据集
解决方案
在某些情况下,我发现 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 开始,当您完成聚合时,您留下一个数据框,因为这些函数通过创建新列、修改数据集的架构来工作。
一般来说,除非你有充分的理由,否则我认为你不应该从工作数据帧代码迁移到类型化数据集。从 Spark 2.4.0 开始,许多 Dataset 功能仍被标记为“实验性”,并且如上所述,并非所有 Dataframe 功能都具有 Dataset 等价物。
推荐阅读
- java - 这个 Java 项目如何使用语言保留字作为标识符?
- python - 烧瓶前端会话是服务器端会话的副本
- python - 如何暂停while循环,直到按下某个键?
- hibernate - 使用 JNDI 进行休眠搜索
- html - 使用 PUPPEETER 获取 #document 中的元素
- r - R中相关随机游走的边界限制
- ruby-on-rails - 如何在 Macbook 上测试 Windows Outlook App 的电子邮件设计?
- java - IllegalAnnotationExceptions:XmlIDREF 属性引用了没有 XmlID 属性的类型“java.lang.String”
- javascript - 在页面加载之前运行模块脚本?
- reactjs - 使用 Jest 模拟 React 组件时出现 TypeScript 错误 TS2339