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

时间:2016-05-30 20:08:35

标签: apache-spark apache-spark-sql spark-dataframe apache-spark-dataset

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

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

  1. 将催化剂类型(在InternalRow中使用)转换为scala类型(在GenericRow中使用)。
  2. 应用功能
  3. 将结果从scala类型转换回催化剂类型
  4. 显然,这比直接在RDD上应用函数而不进行任何转换要慢。任何人都可以通过一些实际情况分析和代码分析来确认或否认我的推测吗?

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

2 个答案:

答案 0 :(得分:3)

从这个Databricks'博客文章A Tale of Three Apache Spark APIs: RDDs, DataFrames, and Datasets

  

何时使用RDD?

     

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

     
      
  • 你想要你的低级别转型,行动和控制   数据集;
  •   
  • 您的数据是非结构化的,例如媒体流或流   文字;
  •   
  • 您希望通过函数式编程来操作数据   构造而不是域特定表达;
  •   
  • 你不在乎   在处理或处理时强加一个模式,如列式格式   按名称或列访问数据属性;
  •   
  • 你可以放弃一些   DataFrames和。的优化和性能优势   结构化和半结构化数据的数据集。
  •   

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

enter image description here

在Databricks'文章提到你也可以发现,与RDD相比,Dataframe优化了空间使用

enter image description here

答案 1 :(得分:0)

我认为数据集是架构RDD。 创建数据集时,应为其指定StructType。

实际上,经过逻辑计划和物理计划的数据集会生成RDD运算符。也许这比RDD性能要强于数据集。