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

tri*_*oid 7 apache-spark apache-spark-sql spark-dataframe apache-spark-dataset

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

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

  1. 将催化剂类型(在InternalRow中使用)转换为scala类型(在GenericRow中使用).
  2. 应用该功能
  3. 将结果从scala类型转换回催化剂类型

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

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

Pau*_*rcq 5

来自 Databricks 的博客文章《三个 Apache Spark API 的故事:RDD、DataFrame 和数据集》

\n\n
\n

何时使用 RDD?

\n\n

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

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

High Performance Spark的第 3 章:DataFrames、Datasets 和 Spark SQL 中,您可以看到使用 Dataframe/Dataset API 与 RDD 相比可以获得的一些性能

\n\n

在此输入图像描述

\n\n

在Databricks的文章中你还可以发现Dataframe相比RDD优化了空间使用

\n\n

在此输入图像描述

\n