![c10cfd7d147b39a921251b59b3b07b38.png](https://i-blog.csdnimg.cn/blog_migrate/4d6439800d3e60f865226493c525153b.jpeg)
1. 目的
今天我们讨论下Apache Spark RDD与DataFrame与DataSet 之间的详细功能比较。我们将简要介绍Spark API,即RDD,DataFrame和DataSet,以及基于各种功能的这些Spark API之间的区别。例如,数据表示,不变性和互操作性等。我们还将说明在何处使用Spark的RDD,DataFrame API和Dataset API。
了解在单节点和多节点集群上安装Apache Spark的简单步骤。
2. Apache Spark API – RDD,DataFrame和DataSet
在开始比较Spark RDD,DataFrame和Dataset之前,让我们看一下Spark中的RDD,DataFrame和Dataset:
- Spark RDD的API - 一个 RDD代表弹性分布式数据集。它是记录的只读分区集合。RDD是Spark的基本数据结构。它允许程序员以容错的方式在大型群集上执行内存中计算。因此,加快了任务。
- Spark Dataframe API – 与RDD不同,数据组织到命名列中。更像一个关系数据库中的二维表。它是不可变的分布式数据集合。Spark中的DataFrame允许开发人员将结构强加到分布式数据集合上,从而实现更高级别的抽象。
- Spark DataSet API – Apache Spark中的DataSet是DataFrame API的扩展,它提供了类型安全的,面向对象的编程接口。数据集通过将表达式和数据字段公开给查询计划者,从而利用了Spark’s Catalyst optimizer。
3. Apache Spark中的RDD与Dataframe与DataSet
现在让我们了解Spark中RDD与DataFrame与DataSet API之间的功能差异:
3.1 Spark 发布
- RDD - RDD自Spark 1.0版本的API就一直存在。
- DataFrames – Spark在Spark 1.3版本中引入了DataFrames。
- DataSet – Spark在Spark 1.6版本中引入了Dataset。
3.2 数据表示
- RDD – RDD是分布在群集中许多计算机上的分布式数据元素集合。RDD是代表数据的一组Java或Scala对象。
- DataFrame – DataFrame是组织为命名列的分布式数据集合。从概念上讲,它等于关系数据库中的表。
- DataSet – 是DataFrame API的扩展,提供了– RDD API的类型安全的,面向对象的编程接口的功能,以及Catalyst查询优化器的性能优势以及DataFrame API的堆外存储机制。
3.3 数据格式
- RDD – 它可以轻松有效地处理结构化和非结构化数据。但是,与Dataframe和DataSet一样,RDD不会假设数据的结构,而是要求用户指定它。
- DataFrame – 仅适用于结构化和半结构化数据。它在命名列(named columns)中组织数据。DataFrames允许Spark管理Schema。
- DataSet –它还可以有效地处理结构化和非结构化数据。它以行的JVM对象或行对象的集合的形式表示数据。通过编码器以表格形式表示。
3.4 数据源API
- RDD –数据源API允许RDD可以来自任何数据源,例如文本文件, 通过JDBC 的数据库等,并且可以轻松地处理没有预定义结构的数据。
- DataFrame –数据源API允许以不同格式(AVRO,CSV,JSON和HDFS,HIVE表,MySQL)处理数据。它可以从上面提到的各种数据源读取和写入。
- DataSet – spark的Dataset API也支持来自不同来源的数据。
3.5 不变性和互操作性
- RDD – RDD包含已分区记录的集合。RDD中并行性的基本单位称为分区。每个分区都是数据的一个逻辑分区,它是不变的,并且是通过对现有分区进行某种转换而创建的。不变性有助于实现计算的一致性。我们可以通过toDF()方法从RDD移到DataFrame(如果RDD为表格格式),也可以通过.rdd方法进行相反的操作。通过示例学习各种RDD Transformations和Actions API。
- DataFrame – 转换为DataFrame后,无法重新生成域对象。例如,如果您从testRDD生成testDF,则将无法恢复测试类的原始RDD。
- DataSet –克服了DataFrame的局限性,可以从Dataframe重新生成RDD。DataSet允许您将现有的RDD和DataFrame转换为数据集。
3.6 编译时类型安全
- RDD – RDD提供了熟悉的面向对象的编程风格以及编译时类型安全性。
- DataFrame – 在这种情况下,如果您尝试访问表中不存在的列,则Dataframe API不支持编译时错误。它仅在运行时检测属性错误。
- DataSet – 提供了编译时类型的安全性。
3.7 优化
- RDD – RDD中没有内置的优化引擎。当使用结构化数据时,RDD无法利用sparks高级优化器的优势。例如,catalyst optimizer 和 Tungsten execution engine引擎。开发人员根据其属性优化每个RDD。
- DataFrame –使用 catalyst optimizer进行优化。数据帧在四个阶段使用催化剂树转换框架:
- a)分析逻辑计划以解析引用。
- b)逻辑计划优化。
- c)身体计划。
- d)代码生成,将查询的一部分编译为Java字节码。
下图还给出了优化阶段的简要概述:
![a5d9e2b41aaa5bddd2c91f369ff34991.png](https://i-blog.csdnimg.cn/blog_migrate/e59ab66ce7058eec5c811b7410f5fccf.jpeg)
- DataSet – 包含用于优化查询计划的Catalyst optimizer 的概念。
3.8 序列化
- RDD – 每当Spark 需要在群集内分发数据或将数据写入磁盘时,它都会使用Java序列化。序列化单个Java和Scala对象的开销非常昂贵,并且需要在节点之间发送数据和结构。
- DataFrame – Spark DataFrame可以将数据以二进制格式序列化到 off-heap storage存储(在内存中),然后直接在此堆外内存上执行许多转换,因为spark可以理解Schema。无需使用Java序列化来编码数据。它提供了钨物理执行后端,该后端显式管理内存并动态生成字节码以进行表达式计算。
- DataSet – 关于序列化数据,Spark中的Dataset API具有编码器的概念,该编码器处理JVM对象到表格表示形式之间的转换。它使用Spark内部的二进制格式存储表格表示形式。数据集允许对序列化数据执行操作并改善内存使用率。它允许按需访问单个属性,而无需对整个对象进行灭菌。
3.9 垃圾收集
- RDD – 创建和销毁单个对象会导致垃圾回收的开销。
- DataFrame – 避免为数据集中的每一行构造单个对象时的垃圾回收成本。
- DataSet – 垃圾回收器也不需要销毁对象,因为序列化是通过Tungsten进行的。这使用了堆外数据序列化。
3.10 效率/内存使用
- RDD – 对Java和Scala对象分别执行序列化会花费很多时间,因此效率会降低。
- DataFrame – 使用堆外内存进行序列化可减少开销。它动态生成字节码,因此可以对该序列化数据执行许多操作。小型操作无需反序列化。
- DataSet – 它允许对序列化数据执行操作并改善内存使用率。因此,它允许按需访问单个属性,而无需反序列化整个对象。
3.11 惰性操作
- RDD – Spark支持RDD的惰性操作。Transformation操作不会开始真正的计算,只有在执行Action操作的时候Spark才会真正开始计算。转化操作不会立刻执行,而是在内部记录下所要执行的操作的相关信息,必要时再执行。
![76e8094aed4035311f73928af30a970d.gif](https://i-blog.csdnimg.cn/blog_migrate/dc3d15856579794d9033d3454a53df55.gif)
- DataFrame – Spark支持DataFrame的惰性操作,这意味着只有在出现动作(例如显示结果,保存输出)时才进行计算。
- DataSet –Spark也支持惰性操作。
3.12 编程语言支持
- RDD – RDD API提供Java,Scala,Python和R语言。因此,此功能为开发人员提供了灵活性。
- DataFrame – 它还具有使用不同语言的API,例如Java,Python,Scala和R。
- DataSet –数据集API当前仅在Scala和Java中可用。Spark版本2.1.1不支持Python和R。
3.13 Schema Projection
- RDD – 在RDD API中,显式使用Schema Projection。因此,我们需要(手动)定义模式。
- DataFrame – 自动从文件中发现模式,并通过Hive Meta Store获取数据的Schema。我们这样做是为了将标准SQL客户端连接到我们的引擎。并探索我们的数据集,而无需定义文件的Schema。
- DataSet – 由于使用Spark SQL 引擎,因此自动发现文件的Shema。
3.14。聚合
- RDD – RDD API执行简单的分组和聚合操作较慢。
- DataFrame – DataFrame API非常易于使用。探索性分析速度更快,可在大型数据集上创建汇总统计信息。
- Dataset – 在Dataset中,对大量Dataset执行聚合操作更快。
3.15。使用范围
- RDD-如果要对数据集进行低级转换和操作,则可以使用RDD。在需要高级抽象时使用RDD。
- DataFrame和DataSet- 当我们需要高度抽象时,可以同时使用DataFrame和数据集API。 用于非结构化数据,例如媒体流或文本流。 需要特定于域的API时,可以同时使用DataFrame或DataSet。 当您要使用功能编程结构而不是特定于域的表达式来操纵数据时。 我们可以在高级表达式中使用DataFrame或DataFrame。例如,过滤器,映射,聚合,求和,SQL查询和列访问。 当您不关心在按名称或列处理或访问数据属性时强加模式(例如列格式)时。 另外,如果我们要在编译时提高类型安全性。
4。结论
通过RDD与DataFrame与Dataset的比较,很清楚何时使用RDD或DataFrame和/或Dataset。 结果,RDD提供了底层功能和控制。DataFrame和Dataset允许自定义视图和结构。它提供了针对特定领域的高级操作,节省了空间,并且可以高速执行。从满足您需求的DataFrames和/或Dataset或RDD API中选择一种,并使用Spark。
译自data-flair
如果发现任何不正确的地方,或者想分享有关上述主题的更多信息,欢迎反馈。