何时使用Spark DataFrame/Dataset API,何时使用普通RDD?

10

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

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

  1. 将 catalyst 类型(在 InternalRow 中使用)转换为 scala 类型(在 GenericRow 中使用)。
  2. 运用该函数
  3. 将结果从 scala 类型转换回 catalyst 类型

显然,这甚至比直接在 RDD 上应用函数更慢,而无需进行任何转换。是否有人可以通过一些真实情况的分析和代码分析来确认或否认我的推测?

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

2个回答

5
从这篇Databricks博客文章中, 《A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets》

何时使用RDD?

考虑以下场景或常见用例,使用RDD:

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

《High Performance Spark》第三章《DataFrames、Datasets和Spark SQL》中,你可以看到使用Dataframe/Dataset API相比RDD可以获得的一些性能表现:

enter image description here

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

enter image description here


0

我认为Dataset是schema RDD。当你创建Dataset时,应该给它一个StructType。

事实上,在逻辑计划和物理计划之后,Dataset将生成RDD操作符。也许这就是RDD性能优于Dataset的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接