RDD vs DataFrame vs Dataset

本篇文章主要是介绍RDD、DataFrame、Dataset这三者的不同

1.RDD、DataFrame、Dataset介绍

1.1 RDD

RDD是Resilient Distributed Datasets的简写。它是一个只读的数据集合。RDD是Spark最基础的数据结构。
RDD允许开发者使用容错的形式在集群中使用内存计算,这样可以提高计算速度。

1.2 DataFrame

DataFrame是使用数据组成命名列,它是一个不可变的分布式数据集合。

1.3 Dataset

Dataset是基于DataFrame的一个扩展,它支持强类型、面向对象编程的接口。Dataset可以通过表达式和字段,使用Catalyst优化器来进行查询优化。

2.RDD vs DataFrame vs Dataset

2.1 什么时候发布

  • RDD在Spark 1.0发布的
  • DataFrame 是在Spark 1.3发布
  • Dataset 是在Spark 1.6发布的

2.2 数据格式

2.2.1 RDD

RDD可以处理结构化或者非结构化数据。RDD不需要获取数据的源数据。

2.2.2 DataFrame

DataFrame只使用结构化和半结构化数据。DataFrame允许Spark管理schema信息。

2.2.3 Dataset

Dataset可以处理结构化或者非结构化数据,使用行或者行集合表示JVM对象中的数据。

2.3 不可变性和可互操作性

RDD包含的数据集合都是可分区的,分区数就是并行度。每个分区是数据的逻辑分区,数据是不可变的,并且可以通过其他RDD使用转换操作获取。
不可变性可以保证计算的一致性。可以通过toDF()方法来生成DataFrame。

转换为DataFrame之后,无法再次生成域对象。可以通过rdd方法生成RDD对象。

可以使用Dataset和DataFrame转换为Dataset。

2.4 编译时期类型安全

SQL DataFrames Datasets
参数错误 运行时错误 编译时错误 编译时错误
分析错误 运行时错误 运行时错误 编译时错误

2.5 优化

  • RDD:RDD中没有内置的优化引擎。当处理结构化数据,RDD不能使用Spark高级优化器。
  • DataFrame:使用catalyst优化器来进行优化。DataFrame在下面4个阶段使用catalyst转换框架:a)分析逻辑计划解析饮用;b)优化逻辑计算;c)物理计划;d)代码生成部分查询编译为Java字节码。
  • Dataset:使用优化器来优化执行计划。

2.6 序列化

RDD在写数据时,使用的时Java序列化,在序列化数据时和节点之间发送数据时,成本高。

在使用DataFrame时,可以将数据以二进制格式存储到堆外,如果知道schema信息时,可以直接处理堆外数据,在编数据时,不需要使用java序列化,Spark提供了一个Tungsten物理执行后端,它可以明确的管理内存并动态生成字节码来进行表达式评估。

在序列化数据时,Dataset有自己的api来实现表格数据与序列化数据的转换。Dataset使用Spark内部的Tungsten二进制格式来存储表格数据,Dataset只获取需要的数据。

2.7 垃圾回收

  • RDD:创建和销毁单个对象而导致垃圾收集的开销。
  • DataFrame:在构造单个对象时,避免垃圾收集成本。
  • Dataset: 不需要销毁对象,因为序列化使用tungsten进行,使用offheap数据序列化。

2.8 效率/内存使用

RDD在序列化数据时,效率低,花费了大量的时间。

DataFrame使用offheap内存可以减少花销,DataFrame动态生成字节代码,以便可以对该序列化数据执行许多操作。无需对小型操作进行反序列化。

Dataset无需对整个对象进行序列化。

2.9 schema信息

RDD需要手动定schema信息。

DataFrame可以根据数据自动发现schema信息。

Dataset可以自动发现文件的schema信息。

2.10 聚合

RDD在进行分组和聚合操作时,速度慢。

DataFrame提供的API,在大量数据集上执行聚合操作、分析操作速度很快。

Dataset在大量数据集上执行聚合操作,效率高。

你可能感兴趣的:(RDD vs DataFrame vs Dataset)