当前位置: 首页 > 知识库问答 >
问题:

Apache Spark中的Dataframe、Dataset和RDD之间有什么区别?

赵俊侠
2023-03-14

在Apache Spark中,这些API之间有什么区别?为什么以及什么时候我们应该选择其中一个?

共有2个答案

吕征
2023-03-14

简而言之:

  • RDD来自Spark的早期版本。数据帧仍然使用“引擎盖下”
  • 数据帧是在Spark 1后期引入的。在Spark 2中真正成熟。x、 它们现在是首选存储。它们在Java中实现为数据集
  • 数据集是通用的实现,例如,您可以有一个数据集

我使用数据帧,并极力推荐它们:Spark的优化器Catalyst能够更好地理解数据集(也就是数据帧),Row是一个比纯JVM对象更好的存储容器。您将在内部找到许多博客帖子(包括Databricks)。

陈欣荣
2023-03-14

首先,让我们定义spark的功能

>

另一个重要的事实是,输入和输出以不同的格式存储,spark具有用于读取和写入这些内容的连接器。但这意味着要序列化和反序列化它们。虽然序列化是透明的,但它通常是最昂贵的操作。

最后,Spark尝试将数据保留在内存中以供处理,但当每个工作器的数据不适合内存时,它会在本地[ser/deser]对每个工作器进行数据化。同样,它是透明地完成的,但可能会很昂贵。有趣的事实:估计数据大小可能需要时间

API

  • RDD公司

这是spark提供的第一个API。简单地说,它是分布在集群上的scala/java对象的非有序序列。在其上执行的所有操作都是jvm方法(传递给map、flatmap、groupBy等)需要序列化、发送给所有工作程序并应用于那里的jvm对象。这与使用scala-Seq几乎相同,但是分布式的。它是强类型的,这意味着“如果它能编译,那么它就能工作”(如果你不作弊)。然而,可能会出现许多分配问题。特别是如果spark不知道如何[反]序列化jvm类和方法。

  • 数据帧

它位于RDD之后,在语义上与RDD非常不同。数据被视为表,可以对其应用sql操作等操作。它根本没有被键入,所以在执行过程中随时都可能出现错误。然而,我认为有两个优点:(1)许多人习惯于表/sql语义和操作,(2)如果数据格式提供合适的列访问,spark不需要反序列化整行来处理其中一列。而且很多都是这样,比如最常用的拼花文件格式。

  • 数据集

它是对数据帧的改进,以带来某种类型的安全性。Dataset是我们将与jvm类相关的“编码器”关联到的数据帧。因此,spark可以在执行代码之前检查数据模式是否正确。然而,请注意,我们有时可以看到数据集是强类型的,但事实并非如此:它带来了一些强类型安全性,您无法编译使用类型不是已声明类型的数据集的代码。但是,很容易生成编译后仍在运行时失败的代码。这是因为许多数据集操作都失去了该类型(几乎是除过滤器之外的所有操作)。尽管如此,这还是一个巨大的改进,因为即使我们犯了错误,它也会很快失败:失败发生在解释spark DAG时(即开始时),而不是在数据处理过程中。

注意:Dataframe现在只是非类型化的Dataset(Dataset

利弊

>

  • 数据集:

    • 优点:优化了面向列的存储的操作
    • 优点:还有许多操作不需要反序列化
    • 优点:如果您喜欢,可以提供表/sql语义(我不喜欢;)
    • 优点:数据集操作带有一个优化引擎“catalyst”,可以提高代码的性能(我不确定它是否真的那么好。如果你知道你的代码,也就是对数据做了什么,你的代码应该自己优化)
    • 缺点:大多数操作输入不准确
    • 缺点:对于不适合的复杂算法来说,数据集操作可能变得过于复杂。我知道的两个主要限制是管理无效数据和复杂的数学算法

    数据帧:

    • 优点:在丢失类型的数据集操作之间需要
    • 缺点:只需使用数据集,它具有所有优点和更多

    RDD:

    • 优点:(真的)强类型
    • 优点:scala /java语义。您可以像处理内存集合的标准应用程序一样设计代码。好吧,使用功能语义:)
    • 缺点:处理数据需要完整的jvm反序列化,在之前提到的任何步骤中:在读取输入之后,以及在需要在工作器之间移动数据或存储在本地以管理内存绑定的所有处理步骤之间。

    结论

    >

  • 默认情况下只需使用数据集:

    • 使用编码器读取输入,如果数据格式允许,它将在开始时验证输入模式
    • 使用数据集操作,当您松开类型时,返回到类型化数据集。通常,使用类型化数据集作为所有方法的输入和输出

    在某些情况下,您想要编写的代码过于复杂,无法使用数据集操作来表达。大多数应用程序都没有,但它经常发生在我的工作中,我在那里实现复杂的数学模型。在这种情况下:

    • 从数据集开始
    • 使用数据集op尽可能多地过滤和洗牌(groupBy,加入)数据
    • 一旦您只有所需的数据,并且不需要移动它们,请转换为rdd并应用复杂的计算。

  •  类似资料:
    • 我只是想知道Apache Spark中的和之间有什么区别(Spark 2.0.0 DataFrame只是)的类型别名? 你能把一个转换成另一个吗?

    • 我开始阅读《Spark权威指南大数据处理变得简单》一书,学习Spark。当我阅读时,我看到一句话:“DataFrame是最常见的结构化API,它只是用行和列表示一个数据表。”我无法理解为什么RDD和数据帧被称为API?

    • 我浏览了一下Spark中RDD和Dataframe的链接有什么区别? > 我们可以在spark上运行Pandas、numpy数据帧功能吗。对于numpy,np。像df这样的熊猫在哪里和在哪里。分组依据[“”]。agg()

    • 嗨,我对apache spark比较陌生。我想了解RDD、dataframe和数据集之间的区别。 例如,我从s3存储桶中提取数据。 在这种情况下,当我从s3加载数据时,什么是RDD?另外,由于RDD是不可变的,所以我可以更改df的值,使df不能是RDD。 如果有人能解释RDD、数据帧和数据集之间的区别,我将不胜感激。

    • 我正在学习Python中的Spark,想知道有没有人能解释一下动作foreach()和转换map()之间的区别? <代码>rdd。map()返回一个新的RDD,就像Python中的原始map函数一样。然而,我想看到一个rdd。foreach()函数并理解其差异。谢谢

    • 我仍在努力理解最近推出的Spark数据集的全部功能。 是否有关于何时使用RDD和何时使用数据集的最佳实践? Databricks在他们的公告中解释说,通过使用数据集,可以实现运行时和内存的惊人减少。尽管如此,据称数据集的设计“与现有RDD API协同工作”。 这仅仅是对向下兼容性的引用,还是有人更愿意在数据集上使用RDD的场景?