为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Spark中的DataFrame,Dataset和RDD之间的区别我只是想知道Apache Spark中的RDD和DataFrame (Spark 2.0.0 DataFrame只是一个类型别名Dataset[Row])有什么区别?你能把一个转换成另一个吗?
查看完整描述

3 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

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

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

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

RDD,另一方面,仅仅是- [R esilient d istributed d ataset是比较数据的黑盒不能作为可以针对它要执行的操作进行优化的,并不像约束。

但是,你可以从一个数据帧到一个RDD通过它的rdd方法,你可以从一个去RDDDataFrame(如果RDD是表格形式),通过该toDF方法

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


查看完整回答
反对 回复 2019-07-27
?
MYYA

TA贡献1868条经验 获得超4个赞

首先是DataFrame从进化而来SchemaRDD

是的..之间的转换Dataframe,并RDD是绝对有可能的。

以下是一些示例代码段。

  • df.rdd 是 RDD[Row]

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

  • 1)yourrddOffrow.toDF转换为DataFrame

  • 2)使用createDataFramesql上下文

    val df = spark.createDataFrame(rddOfRow, schema)

架构可以来自下面的一些选项,如很好的SO帖子所描述的..
来自scala案例类和scala反射api

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

或使用 Encoders

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

如Schema所描述的也可以使用StructType和 创建StructField

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

事实上,现在有3个Apache Spark API ..

  1. RDD API:

RDD,因为1.0版本(弹性分布式数据集)API已在火花。

所述RDDAPI提供了许多转化方法,例如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引入了一个新的DataFrameAPI作为Project Tungsten计划的一部分,该计划旨在提高Spark的性能和可扩展性。该DataFrameAPI引入了一个模式来描述数据的概念,使星火管理模式和唯一的节点之间传递数据,比使用Java序列化一个更有效的方式。

DataFrameAPI是从根本上不同的RDDAPI,因为它是建立一个关系查询计划,星火的催化剂优化就可以执行的API。对于熟悉构建查询计划的开发人员而言,API很自然

示例SQL样式:

df.filter("age > 21");

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

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

例如,在DataFrame从现有RDDJava对象创建时,Spark的Catalyst优化器无法推断架构并假定DataFrame中的任何对象都实现了该scala.Product接口。Scala case class解决了这个问题,因为他们实现了这个界面。

  1. Dataset API

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

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

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

示例DatasetAPI SQL样式:

dataset.filter(_.age < 21);

评价差异。之间DataFrameDataSet 

进一步阅读...数据库文章 - 三个Apache Spark API的故事:RDDs与DataFrames和数据集


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 2318 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信