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

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

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

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


繁花不似锦
浏览 2319回答 3
3回答

红颜莎娜

通过DataFrame谷歌搜索“DataFrame定义”来定义A:数据框是一个表或二维数组结构,其中每列包含一个变量的测量值,每行包含一个案例。因此,DataFrame由于其表格格式,a 具有额外的元数据,这允许Spark在最终查询上运行某些优化。的RDD,另一方面,仅仅是- [R esilient d istributed d ataset是比较数据的黑盒不能作为可以针对它要执行的操作进行优化的,并不像约束。但是,你可以从一个数据帧到一个RDD通过它的rdd方法,你可以从一个去RDD到DataFrame(如果RDD是表格形式),通过该toDF方法通常,DataFrame由于内置的查询优化,建议尽可能使用。

MYYA

首先是DataFrame从进化而来SchemaRDD。是的..之间的转换Dataframe,并RDD是绝对有可能的。以下是一些示例代码段。df.rdd&nbsp;是&nbsp;RDD[Row]以下是一些创建数据框的选项。1)yourrddOffrow.toDF转换为DataFrame。2)使用createDataFramesql上下文val df = spark.createDataFrame(rddOfRow, schema)架构可以来自下面的一些选项,如很好的SO帖子所描述的..来自scala案例类和scala反射apiimport&nbsp;org.apache.spark.sql.catalyst.ScalaReflectionval&nbsp;schema&nbsp;=&nbsp;ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]或使用&nbsp;Encodersimport&nbsp;org.apache.spark.sql.Encodersval&nbsp;mySchema&nbsp;=&nbsp;Encoders.product[MyCaseClass].schema如Schema所描述的也可以使用StructType和&nbsp;创建StructFieldval&nbsp;schema&nbsp;=&nbsp;new&nbsp;StructType() &nbsp;&nbsp;.add(StructField("id",&nbsp;StringType,&nbsp;true)) &nbsp;&nbsp;.add(StructField("col1",&nbsp;DoubleType,&nbsp;true)) &nbsp;&nbsp;.add(StructField("col2",&nbsp;DoubleType,&nbsp;true))&nbsp;etc...事实上,现在有3个Apache Spark API ..RDD&nbsp;API:的RDD,因为1.0版本(弹性分布式数据集)API已在火花。所述RDDAPI提供了许多转化方法,例如map(),&nbsp;filter(),和reduce(),用于对数据执行计算。这些方法中的每一个都产生RDD表示变换数据的新方法。但是,这些方法只是定义要执行的操作,并且在调用操作方法之前不会执行转换。动作方法的示例是collect()和saveAsObjectFile()。RDD示例:rdd.filter(_.age&nbsp;>&nbsp;21)&nbsp;//&nbsp;transformation &nbsp;&nbsp;&nbsp;.map(_.last)//&nbsp;transformation.saveAsObjectFile("under21.bin")&nbsp;//&nbsp;action示例:使用RDD按属性过滤rdd.filter(_.age&nbsp;>&nbsp;21)DataFrame&nbsp;APISpark 1.3引入了一个新的DataFrameAPI作为Project Tungsten计划的一部分,该计划旨在提高Spark的性能和可扩展性。该DataFrameAPI引入了一个模式来描述数据的概念,使星火管理模式和唯一的节点之间传递数据,比使用Java序列化一个更有效的方式。该DataFrameAPI是从根本上不同的RDDAPI,因为它是建立一个关系查询计划,星火的催化剂优化就可以执行的API。对于熟悉构建查询计划的开发人员而言,API很自然示例SQL样式:df.filter("age > 21");限制:&nbsp;因为代码是按名称引用数据属性,所以编译器无法捕获任何错误。如果属性名称不正确,则只有在创建查询计划时才会在运行时检测到错误。DataFrameAPI的另一个缺点是它非常以scala为中心,虽然它确实支持Java,但支持有限。例如,在DataFrame从现有RDDJava对象创建时,Spark的Catalyst优化器无法推断架构并假定DataFrame中的任何对象都实现了该scala.Product接口。Scala&nbsp;case class解决了这个问题,因为他们实现了这个界面。Dataset&nbsp;API该DatasetAPI作为Spark 1.6中的API预览发布,旨在提供两全其美的功能;&nbsp;熟悉的面向对象编程风格和RDDAPI的编译时类型安全性,但具有Catalyst查询优化器的性能优势。数据集也使用与DataFrameAPI&nbsp;相同的高效堆外存储机制&nbsp;。在序列化数据时,DatasetAPI具有编码器的概念,&nbsp;可在JVM表示(对象)和Spark的内部二进制格式之间进行转换。Spark具有非常先进的内置编码器,它们生成字节代码以与堆外数据交互,并提供对各个属性的按需访问,而无需对整个对象进行反序列化。Spark尚未提供用于实现自定义编码器的API,但计划在将来的版本中使用。此外,DatasetAPI旨在与Java和Scala同样良好地工作。使用Java对象时,重要的是它们完全符合bean。示例DatasetAPI SQL样式:dataset.filter(_.age&nbsp;<&nbsp;21);评价差异。之间DataFrame&DataSet:&nbsp;进一步阅读...数据库文章 - 三个Apache Spark API的故事:RDDs与DataFrames和数据集
打开App,查看更多内容
随时随地看视频慕课网APP