昨天小強(qiáng)帶著大家了解了Spark SQL的由來、Spark SQL的架構(gòu)和SparkSQL四大組件:Spark SQL、DataSource Api、DataFrame Api和Dataset Api。今天小強(qiáng)和大家一起揭開Spark SQL背后DataFrame和Dataset的面紗。
DataFrame和Dataset演變
Spark要對閉包進(jìn)行計(jì)算、將其序列化,并將她們發(fā)送到執(zhí)行進(jìn)程,這意味著你的代碼是以原始形式發(fā)送的,基本沒有經(jīng)過優(yōu)化。在RDD中午發(fā)表是結(jié)構(gòu)化數(shù)據(jù),對RDD進(jìn)行查詢也不可行。使用RDD很容易但有時候處理元組會把代碼弄亂。引入DataFrame和Dataset可以處理數(shù)據(jù)代碼更加易讀,支持java、scala、python和R等。
DataFrame用于創(chuàng)建數(shù)據(jù)的行和列,它就像是關(guān)系數(shù)據(jù)庫管理系統(tǒng)中的一張表,DataFrame是一種常見的數(shù)據(jù)分析抽象。
Dataset結(jié)合了DataFrame和RDD的優(yōu)勢:靜態(tài)類型、會更容易實(shí)現(xiàn)RDD的功能特性,以及DataFrame的卓越性能特性。
為什么使用DataFrame和Dataset
小強(qiáng)認(rèn)為答案很簡單:速度和易用性。DataFrame提供了優(yōu)化、速度、自動模式發(fā)現(xiàn);他們會讀取更少的數(shù)據(jù),并提供了RDD之間的互相操作性。
1、優(yōu)化
Catalyst為DataFrame提供了優(yōu)化:謂詞下的推到數(shù)據(jù)源,只讀取需要的數(shù)據(jù)。創(chuàng)建用于執(zhí)行的物理計(jì)劃,并生成比手寫代碼更優(yōu)化的JVM字節(jié)碼。
就像上圖這樣,DataFrame和Dataset進(jìn)行了緩存,在緩存時,他們以更加高效的列式自動存儲數(shù)據(jù),這種格式比java、Python對象明顯更為緊湊,并進(jìn)行了優(yōu)化。
2、速度
由于優(yōu)化器會生成用于的JVM字節(jié)碼,scala和python程序就有相似的性能。Dataset使用優(yōu)化的編碼器把對象進(jìn)行序列化和反序列化,以便進(jìn)行并處理并通過網(wǎng)絡(luò)傳輸。
3、自動模式發(fā)現(xiàn)
要從RDD創(chuàng)建DataFrame,必須提供一個模式。而從JSON、Parquet和ORC文件創(chuàng)建DataFrame時,會自動發(fā)現(xiàn)一個模式,包括分區(qū)的發(fā)現(xiàn)。
實(shí)踐
在pyspark shell或spark-shell中,會自動創(chuàng)建一個名為spark的預(yù)配置SparkSession。
從Spark 2.0及更高的版本,SparkSession成為關(guān)系型功能的入口點(diǎn)。當(dāng)使用Hive時,SparkSession必須使用enableSupport方法創(chuàng)建,用來訪問Hive Metastore、SerDes和用戶自定義的函數(shù)。
創(chuàng)建DataFrame有三種方式:
1、從結(jié)構(gòu)化數(shù)據(jù)文件創(chuàng)建DataFrame
2、從RDD創(chuàng)建DataFrame
3、從Hive中的表中創(chuàng)建DataFrame
把DataFrame轉(zhuǎn)換為RDD非常簡單,只需要使用.rdd方法
常用方法的示例
1、DS與DF的關(guān)系
type DataFrame = Dataset[Row]
2、加載txt數(shù)據(jù)
val rdd = sc.textFile("data")
val df = rdd.toDF()
這種直接生成DF,df數(shù)據(jù)結(jié)構(gòu)為(查詢語句:df.select("*").show(5))
只有一列,屬性為value。
3、 df.printSchema()
4、使用反射推斷模式
小結(jié)
小強(qiáng)從DataFrame和Dataset演變以及為什么使用他們,還有對于DataFrame和Dataset創(chuàng)建和互相轉(zhuǎn)換的一些實(shí)踐例子進(jìn)行介紹,當(dāng)時這些都是比較基礎(chǔ)的。深入學(xué)習(xí)Spark SQL需要了解更多Spark SQL提供的方法。后續(xù)小強(qiáng)為大家?guī)鞸aprk SQL相關(guān)方法以及優(yōu)化。
【關(guān)注】和【點(diǎn)贊】是對小強(qiáng)最大的支持!??!