3 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個贊
通過DataFrame
谷歌搜索“DataFrame定義”來定義A:
數(shù)據(jù)框是一個表或二維數(shù)組結(jié)構(gòu),其中每列包含一個變量的測量值,每行包含一個案例。
因此,DataFrame
由于其表格格式,a 具有額外的元數(shù)據(jù),這允許Spark在最終查詢上運(yùn)行某些優(yōu)化。
的RDD
,另一方面,僅僅是- [R esilient d istributed d ataset是比較數(shù)據(jù)的黑盒不能作為可以針對它要執(zhí)行的操作進(jìn)行優(yōu)化的,并不像約束。
但是,你可以從一個數(shù)據(jù)幀到一個RDD
通過它的rdd
方法,你可以從一個去RDD
到DataFrame
(如果RDD是表格形式),通過該toDF
方法
通常,DataFrame
由于內(nèi)置的查詢優(yōu)化,建議盡可能使用。

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個贊
首先是
DataFrame
從進(jìn)化而來SchemaRDD
。
是的..之間的轉(zhuǎn)換Dataframe
,并RDD
是絕對有可能的。
以下是一些示例代碼段。
df.rdd
是RDD[Row]
以下是一些創(chuàng)建數(shù)據(jù)框的選項(xiàng)。
1)
yourrddOffrow.toDF
轉(zhuǎn)換為DataFrame
。2)使用
createDataFrame
sql上下文val df = spark.createDataFrame(rddOfRow, schema)
架構(gòu)可以來自下面的一些選項(xiàng),如很好的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
和 創(chuàng)建StructField
val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc...
事實(shí)上,現(xiàn)在有3個Apache Spark API ..
RDD
API:
的
RDD
,因?yàn)?.0版本(彈性分布式數(shù)據(jù)集)API已在火花。所述
RDD
API提供了許多轉(zhuǎn)化方法,例如map
(),filter
(),和reduce
(),用于對數(shù)據(jù)執(zhí)行計算。這些方法中的每一個都產(chǎn)生RDD
表示變換數(shù)據(jù)的新方法。但是,這些方法只是定義要執(zhí)行的操作,并且在調(diào)用操作方法之前不會執(zhí)行轉(zhuǎn)換。動作方法的示例是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的性能和可擴(kuò)展性。該DataFrame
API引入了一個模式來描述數(shù)據(jù)的概念,使星火管理模式和唯一的節(jié)點(diǎn)之間傳遞數(shù)據(jù),比使用Java序列化一個更有效的方式。該
DataFrame
API是從根本上不同的RDD
API,因?yàn)樗墙⒁粋€關(guān)系查詢計劃,星火的催化劑優(yōu)化就可以執(zhí)行的API。對于熟悉構(gòu)建查詢計劃的開發(fā)人員而言,API很自然
示例SQL樣式:
df.filter("age > 21");
限制: 因?yàn)榇a是按名稱引用數(shù)據(jù)屬性,所以編譯器無法捕獲任何錯誤。如果屬性名稱不正確,則只有在創(chuàng)建查詢計劃時才會在運(yùn)行時檢測到錯誤。
DataFrame
API的另一個缺點(diǎn)是它非常以scala為中心,雖然它確實(shí)支持Java,但支持有限。
例如,在DataFrame
從現(xiàn)有RDD
Java對象創(chuàng)建時,Spark的Catalyst優(yōu)化器無法推斷架構(gòu)并假定DataFrame中的任何對象都實(shí)現(xiàn)了該scala.Product
接口。Scala case class
解決了這個問題,因?yàn)樗麄儗?shí)現(xiàn)了這個界面。
Dataset
API
該
Dataset
API作為Spark 1.6中的API預(yù)覽發(fā)布,旨在提供兩全其美的功能; 熟悉的面向?qū)ο缶幊田L(fēng)格和RDD
API的編譯時類型安全性,但具有Catalyst查詢優(yōu)化器的性能優(yōu)勢。數(shù)據(jù)集也使用與DataFrame
API 相同的高效堆外存儲機(jī)制 。在序列化數(shù)據(jù)時,
Dataset
API具有編碼器的概念, 可在JVM表示(對象)和Spark的內(nèi)部二進(jìn)制格式之間進(jìn)行轉(zhuǎn)換。Spark具有非常先進(jìn)的內(nèi)置編碼器,它們生成字節(jié)代碼以與堆外數(shù)據(jù)交互,并提供對各個屬性的按需訪問,而無需對整個對象進(jìn)行反序列化。Spark尚未提供用于實(shí)現(xiàn)自定義編碼器的API,但計劃在將來的版本中使用。此外,
Dataset
API旨在與Java和Scala同樣良好地工作。使用Java對象時,重要的是它們完全符合bean。
示例Dataset
API SQL樣式:
dataset.filter(_.age < 21);
評價差異。之間DataFrame
&DataSet
:
進(jìn)一步閱讀...數(shù)據(jù)庫文章 - 三個Apache Spark API的故事:RDDs與DataFrames和數(shù)據(jù)集
添加回答
舉報