昨天小強(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很容易但有時(shí)候處理元組會把代碼弄亂诲锹。引入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í)处嫌,他們以更加高效的列式自動存儲數(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時(shí)搀军,會自動發(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時(shí)乳愉,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)時(shí)這些都是比較基礎(chǔ)的。深入學(xué)習(xí)Spark SQL需要了解更多Spark SQL提供的方法瞪讼。后續(xù)小強(qiáng)為大家?guī)鞸aprk SQL相關(guān)方法以及優(yōu)化钧椰。
【關(guān)注】和【點(diǎn)贊】是對小強(qiáng)最大的支持!7贰嫡霞!