3 回答
TA贡献1842条经验 获得超12个赞
通过DataFrame
谷歌搜索“DataFrame定义”来定义A:
数据框是一个表或二维数组结构,其中每列包含一个变量的测量值,每行包含一个案例。
因此,DataFrame
由于其表格格式,a 具有额外的元数据,这允许Spark在最终查询上运行某些优化。
的RDD
,另一方面,仅仅是- [R esilient d istributed d ataset是比较数据的黑盒不能作为可以针对它要执行的操作进行优化的,并不像约束。
但是,你可以从一个数据帧到一个RDD
通过它的rdd
方法,你可以从一个去RDD
到DataFrame
(如果RDD是表格形式),通过该toDF
方法
通常,DataFrame
由于内置的查询优化,建议尽可能使用。
TA贡献1868条经验 获得超4个赞
首先是
DataFrame
从进化而来SchemaRDD
。
是的..之间的转换Dataframe
,并RDD
是绝对有可能的。
以下是一些示例代码段。
df.rdd
是RDD[Row]
以下是一些创建数据框的选项。
1)
yourrddOffrow.toDF
转换为DataFrame
。2)使用
createDataFrame
sql上下文val df = spark.createDataFrame(rddOfRow, schema)
架构可以来自下面的一些选项,如很好的SO帖子所描述的..
来自scala案例类和scala反射apiimport 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...
RDD
API:
的
RDD
,因为1.0版本(弹性分布式数据集)API已在火花。所述
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)
DataFrame
API
Spark 1.3引入了一个新的
DataFrame
API作为Project Tungsten计划的一部分,该计划旨在提高Spark的性能和可扩展性。该DataFrame
API引入了一个模式来描述数据的概念,使星火管理模式和唯一的节点之间传递数据,比使用Java序列化一个更有效的方式。该
DataFrame
API是从根本上不同的RDD
API,因为它是建立一个关系查询计划,星火的催化剂优化就可以执行的API。对于熟悉构建查询计划的开发人员而言,API很自然
示例SQL样式:
df.filter("age > 21");
限制: 因为代码是按名称引用数据属性,所以编译器无法捕获任何错误。如果属性名称不正确,则只有在创建查询计划时才会在运行时检测到错误。
DataFrame
API的另一个缺点是它非常以scala为中心,虽然它确实支持Java,但支持有限。
例如,在DataFrame
从现有RDD
Java对象创建时,Spark的Catalyst优化器无法推断架构并假定DataFrame中的任何对象都实现了该scala.Product
接口。Scala case class
解决了这个问题,因为他们实现了这个界面。
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);
评价差异。之间DataFrame
&DataSet
:
进一步阅读...数据库文章 - 三个Apache Spark API的故事:RDDs与DataFrames和数据集
添加回答
举报