Spark中的DataFrame,Dataset和RDD之间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark中的DataFrame,Dataset和RDD之间的区别相关的知识,希望对你有一定的参考价值。

我只是想知道在Apache Spark中RDDDataFrame(Spark 2.0.0 DataFrame只是Dataset[Row]的类型别名)有什么区别?

你能把一个转换成另一个吗?

答案

通过谷歌搜索“DataFrame定义”来定义DataFrame

数据框是一个表或二维数组结构,其中每列包含一个变量的测量值,每行包含一个案例。

因此,DataFrame由于其表格格式而具有额外的元数据,这允许Spark在最终查询上运行某些优化。

另一方面,RDD仅仅是一个弹性分布式数据集,它更像是一个无法优化的数据黑盒,因为可以对其执行的操作不受约束。

但是,您可以通过其RDD方法从DataFrame转到rdd,您可以通过RDD方法从DataFrame转到toDF(如果RDD是表格格式)

通常,由于内置的​​查询优化,建议尽可能使用DataFrame

另一答案

Dataframe是Row对象的RDD,每个对象代表一条记录。 Dataframe还知道其行的模式(即数据字段)。虽然Dataframes看起来像常规RDD,但在内部它们以更有效的方式存储数据,利用其架构。此外,它们还提供RDD上不可用的新操作,例如运行SQL查询的功能。可以从外部数据源,查询结果或常规RDD创建数据帧。

参考文献:Zaharia M.,et al。学习星火(O'Reilly,2015)

另一答案

Few insights from usage perspective, RDD vs DataFrame:

  1. RDD太棒了!因为它们为我们提供了处理几乎任何类型数据的灵活性;非结构化,半结构化和结构化数据。因为很多时候数据还没有准备好适应DataFrame(甚至是JSON),RDD可以用来对数据进行预处理,以便它可以适应数据帧。 RDD是Spark中的核心数据抽象。
  2. 并非所有可在RDD上进行的转换都可以在DataFrame上进行,例如,subtract()用于RDD vs(除了()用于DataFrame。
  3. 由于DataFrame类似于关系表,因此在使用set / relational theory转换时它们遵循严格的规则,例如,如果要联合两个数据帧,则要求两个dfs具有相同数量的列和关联的列数据类型。列名可以不同。这些规则不适用于RDD。 Here is a good tutorial解释这些事实。
  4. 使用DataFrames可以提高性能,因为其他人已经深入解释过了。
  5. 使用DataFrames时,您不需要像使用RDD编程那样传递任意函数。
  6. 你需要SQLContext / HiveContext来编程数据帧,因为它们位于spark eco系统的SparkSQL区域,但对于RDD,你只需要SparkContext / JavaSparkContext,它位于Spark Core库中。
  7. 如果可以为RDD定义架构,则可以从RDD创建df。
  8. 您还可以将df转换为rdd,将rdd转换为df。

我希望它有所帮助!

另一答案

您可以将RDD与结构化和非结构化一起使用,其中Dataframe / Dataset只能处理结构化和半结构化数据(它具有适当的模式)

另一答案

DataFrame是具有架构的RDD。您可以将其视为关系数据库表,因为每列都有一个名称和一个已知类型。 DataFrames的强大之处在于,当您从结构化数据集(Json,Parquet ..)创建DataFrame时,Spark能够通过对整个(Json,Parquet ..)数据集进行传递来推断模式。被装载。然后,在计算执行计划时,Spark可以使用模式并进行更好的计算优化。请注意,在Spark v1.3.0之前,DataFrame称为SchemaRDD

另一答案

所有优秀的答案和使用每个API都有一些权衡。数据集是为了解决很多问题而构建的超级API,但很多时候如果你了解你的数据并且如果处理算法被优化以便在单次传递到大数据时做很多事情,则RDD仍然效果最好,那么RDD似乎是最佳选择。

使用数据集API的聚合仍然消耗内存,并且随着时间的推移会变得更好。

另一答案

第一件事是DataFrame是从SchemaRDD演变而来的。

depreated method toSchemaRDD

是的.. DataframeRDD之间的转换是绝对可能的。

以下是一些示例代码段。

  • df.rddRDD[Row]

以下是一些创建数据框的选项。

  • 1)yourrddOffrow.toDF转换为DataFrame
  • 2)使用sql context的createDataFrame val df = spark.createDataFrame(rddOfRow, schema)

架构可以来自以下某些选项as described by nice SO post.. 从scala案例类和scala反射api

import org.apache.spark.sql.catalyst.ScalaReflection
val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]

或使用Encoders

import org.apache.spark.sql.Encoders
val mySchema = Encoders.product[MyCaseClass].schema

如Schema所描述,也可以使用StructTypeStructField创建

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("col1", DoubleType, true))
  .add(StructField("col2", DoubleType, true)) etc...

image description

In fact there Are Now 3 Apache Spark APIs..

enter image description here

  1. RDD API:

自1.0发布以来,RDD(Resilient Distributed Dataset)API一直在Spark中。

RDD API提供了许多转换方法,例如map(),filter()和reduce(),用于对数据执行计算。这些方法中的每一种都产生代表转换数据的新RDD。但是,这些方法只是定义要执行的操作,并且在调用操作方法之前不会执行转换。动作方法的示例是collect()和saveAsObjectFile()。

RDD示例:

rdd.filter(_.age > 21) // transformation
   .map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action

示例:使用RDD按属性过滤

rdd.filter(_.age > 21)
  1. DataFrame API

Spark 1.3引入了一个新的DataFrame API,作为Project Tungsten计划的一部分,旨在提高Spark的性能和可扩展性。 DataFrame API引入了描述数据的模式概念,允许Spark管理模式,只在节点之间传递数据,比使用Java序列化更有效。

DataFrame API与RDD API完全不同,因为它是用于构建Spark的Catalyst优化器然后可以执行的关系查询计划的API。对于熟悉构建查询计划的开发人员而言,API很自然

示例SQL样式:

df.filter("age > 21");

限制:因为代码是按名称引用数据属性,所以编译器无法捕获任何错误。如果属性名称不正确,则只有在创建查询计划时才会在运行时检测到错误。

DataFrame API的另一个缺点是它非常以scala为中心,虽然它支持Java,但支持有限。

例如,当从现有的DataFrame的Java对象创建RDD时,Spark的Catalyst优化器无法推断架构并假设DataFrame中的任何对象都实现了scala.Product接口。 Scala case class开箱即用,因为他们实现了这个界面。

  1. Dataset API

Dataset API作为Spark 1.6中的API预览发布,旨在提供两全其美的优势;熟悉的面向对象编程风格和RDD API的编译时类型安全性,但具有Catalyst查询优化器的性能优势。数据集也使用与DataFrame API相同的高效堆外存储机制。

在序列化数据时,Dataset API具有编码器的概念,可在JVM表示(对象)和Spark的内部二进制格式之间进行转换。 Spark具有非常先进的内置编码器,它们生成字节代码以与堆外数据交互,并提供对各个属性的按需访问,而无需对整个对象进行反序列化。 Spark尚未提供用于实现自定义编码器的API,但计划在将来的版本中使用。

此外,Dataset API旨在与Java和Scala同样良好地工作。使用Java对象时,重要的是它们完全符合bean。

示例Dataset API SQL样式:

dataset.filter(_.age < 21);

评价差异。在DataFrameDataSet之间:enter image description here

进一步阅读... databricks article

另一答案

Apache Spark提供三种类型的API

  1. EET
  2. 数据帧
  3. 数据集

Comparing RDD, Dataframe and Dataset APIs

以下是RDD,Dataframe和Dataset之间的API比较。

EET

Spark提供的主要抽象是弹性分布式数据集(RDD),它是跨群集节点分区的元素的集合,可以并行操作。

RDD特点: -

  • 分布式集合: RDD使用MapReduce操作,该操作被广泛用于在群集上使用并行分布式算法处理和生成大型数据集。它允许用户使用一组高级操作符编写并行计算,而不必担心工作分配和容错。
  • 不可变:RDD由分区的记录集合组成。分区是RDD中并行性的基本单元,每个分区是数据的一个逻辑分区,它是不可变的,并通过现有分区上的一些转换创建。可变性有助于实现计算的一致性。
  • 容错:在我们丢失一些RDD分区的情况下,我们可以在lineage中重放该分区上的转换来实现相同的计算,而不是跨多个节点进行数据复制。这个特性是RDD的最大好处,因为它节省了在数据管理和复制方面做了很多努力,从而实现了更快的计算。
  • 延迟评估:Spark中的所有转换都是惰性的,因为它们不会立即计算结果。相反,他们只记得应用于某些基础数据集的转换。仅当操作需要将结果返回到驱动程序时才会计算转换。
  • 功能转换:RDD支持两种类型的操作:转换(从现有数据集创建新数据集)和操作(在数据集上运行

    以上是关于Spark中的DataFrame,Dataset和RDD之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

    Spark中RDDDataFrame和DataSet的区别与联系

    Spark中RDDDataFrame和DataSet的区别与联系

    Spark中RDDDataFrame和DataSet的区别与联系

    Spark——RDD和DataFrame和DataSet三者间的区别

    DataFrame DataSet Spark SQL学习

    Spark Dataframe/ Dataset:通用条件累积和