10

Spark SQL DataFrame/Dataset 执行引擎有几个非常有效的时间和空间优化(例如 InternalRow 和表达式 codeGen)。根据许多文档,对于大多数分布式算法来说,它似乎是比 RDD 更好的选择。

但是,我做了一些源代码研究,仍然不相信。我毫不怀疑 InternalRow 更紧凑,可以节省大量内存。但是算法的执行可能不会比保存预定义的表达式更快。也就是说,在 的源代码中指出 org.apache.spark.sql.catalyst.expressions.ScalaUDF,每个用户定义的函数都会做 3 件事:

  1. 将催化剂类型(用于 InternalRow)转换为 scala 类型(用于 GenericRow)。
  2. 应用函数
  3. 将结果从 scala 类型转换回催化剂类型

显然,这甚至比直接在 RDD 上应用该函数而不进行任何转换还要慢。任何人都可以通过一些真实案例分析和代码分析来确认或否认我的猜测吗?

非常感谢您的任何建议或见解。

4

2 回答 2

5

来自 Databricks 的博客文章三个 Apache Spark API 的故事:RDD、DataFrames 和 Datasets

什么时候使用 RDD?

在以下情况下考虑使用 RDD 的这些场景或常见用例:

  • 您想要对数据集进行低级转换、操作和控制;
  • 您的数据是非结构化的,例如媒体流或文本流;
  • 你想用函数式编程结构而不是特定领域的表达式来操作你的数据;
  • 在按名称或列处理或访问数据属性时,您不关心强加模式,例如列格式;
  • 并且您可以放弃 DataFrames 和 Datasets 为结构化和半结构化数据提供的一些优化和性能优势。

高性能 Spark的第 3 章数据帧、数据集和 Spark SQL 中,您可以看到与 RDD 相比,使用 Dataframe/Dataset API 可以获得的一些性能

在此处输入图像描述

在提到的 Databricks 的文章中,您还可以发现 Dataframe 与 RDD 相比优化了空间使用

在此处输入图像描述

于 2017-06-01T21:14:10.080 回答
0

我认为数据集是模式 RDD。当你创建数据集时,你应该给它 StructType。

事实上,Dataset 经过逻辑规划和物理规划后,会生成 RDD 算子。也许这就是 RDD 性能超过 Dataset。

于 2020-08-12T03:11:16.967 回答