r dataframe删除列_大数据系列:Spark中 RDD、DataFrame、DataSet的比较

c10cfd7d147b39a921251b59b3b07b38.png

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
  • 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
  • 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

如果发现任何不正确的地方,或者想分享有关上述主题的更多信息,欢迎反馈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值