spark的rdd,dataframe和dataset对比

  • 1.RDD

RDD,全称为 Resilient Distributed Datasets,即分布式数据集,是 Spark 中最基本的数据抽象,它代表一个不可变、 可分区、里面的元素可以并行计算的集合。在Spark 中,对数据的所有操作不外乎创建 RDD、转化已有 RDD 以及调用 RDD 操作进行求值。每个 RDD 都被分为多个分区,这些分区运行在集群中的不同的节点上。RDD 可以包含 Python、Java、Scala 中任意类型的对象,甚至可以包含用户自定义的对象。RDD 具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升查询速度。

RDD 支持两种操作:transformation 操作和 action 操作。RDD 的 transformation操作是返回一个新的 RDD 的操作,比如 map 和 filter(),而 action 操作则是向驱动器程序返回结果或者把结果写入外部系统的操作,比如 count()和 first()。

  • 2.DataFrame

DataFrame 是一个分布式数据容器。相比于 RDD,DataFrame 更像传统数据库中的二维表格,除了数据之外,还记录数据的结构信息,即 schema。同时,与 Hive类似,DataFrame 也支持嵌套数据类型(struct,array 和 map)。从 API 易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。由于与 R 和 Pandas 中的 DataFrame 类似,Spark DataFrame 很好地继承了传统单机数据分析体验。

spark的rdd,dataframe和dataset对比

如上图所示,左侧的 RDD[Person]虽然以 Person 为类型参数,但是 Spark 框架本身不了解 Person 类的内部结构。而右侧的 DataFrame 却提供了详细的结构信息,使得 SparkSQL 可以清楚地知道该数据集中包含那些列,每列的名称是什么。
DataFrame 多了数据的结构信息,即 schema。RDD 是分布式的 Java 对象的集合。DataFrame 是分布式的 Row 对象的集合。DataFrame 处理提供了比 RDD 更为丰富的算子以外,更重要的是提升了执行效率、减少数据读取以及执行计划的优化,比如
filter 下推、裁剪等。

DataFrame 是 DataSet 的特例,DataFrame = DataSet[Row],所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些类型一样,所有的表结构信息都用 Row 来表示。

DataFrame可以注册成临时表,也可以将临时表缓存起来。注册临时表的好处在于,可以通过查询hive一样,使用sql 查表,使用开窗函数进行数据分析。

  • 3.DataSet

DataSet 是 DataFrame API 的一个拓展,是 Spark 最新的数据抽象。DataSet 具有用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性。DataSet 支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。样例类被用来在 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到 DataSet 中的字段名称。DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person] 。DataFrame 只知道字段,但是不知道字段的类型,所以在执行这些操作的时候,是没有办法在编译的时候检查是否类型失败的,比如你可以对一个 String 类型进行加减法操作,在执行的时候才会报错,而 DataSet 不仅仅知道字段,而且知道字段类型,所以有更为严格的错误检查。就更 JSON 对象和类对象之间的类比。