《從0到1學習Spark》--DataFrame和Dataset探祕

昨天小強帶着大家瞭解了Spark SQL的由來、Spark SQL的架構和SparkSQL四大組件:Spark SQL、DataSource Api、DataFrame Api和Dataset Api。今天小強和大家一起揭開Spark SQL背後DataFrame和Dataset的面紗。

DataFrame和Dataset演變

Spark要對閉包進行計算、將其序列化,並將她們發送到執行進程,這意味着你的代碼是以原始形式發送的,基本沒有經過優化。在RDD中午發表是結構化數據,對RDD進行查詢也不可行。使用RDD很容易但有時候處理元組會把代碼弄亂。引入DataFrame和Dataset可以處理數據代碼更加易讀,支持java、scala、python和R等。
DataFrame用於創建數據的行和列,它就像是關係數據庫管理系統中的一張表,DataFrame是一種常見的數據分析抽象。
Dataset結合了DataFrame和RDD的優勢:靜態類型、會更容易實現RDD的功能特性,以及DataFrame的卓越性能特性。

爲什麼使用DataFrame和Dataset

小強認爲答案很簡單:速度和易用性。DataFrame提供了優化、速度、自動模式發現;他們會讀取更少的數據,並提供了RDD之間的互相操作性。
1、優化
Catalyst爲DataFrame提供了優化:謂詞下的推到數據源,只讀取需要的數據。創建用於執行的物理計劃,並生成比手寫代碼更優化的JVM字節碼。

就像上圖這樣,DataFrame和Dataset進行了緩存,在緩存時,他們以更加高效的列式自動存儲數據,這種格式比java、Python對象明顯更爲緊湊,並進行了優化。
2、速度
由於優化器會生成用於的JVM字節碼,scala和python程序就有相似的性能。Dataset使用優化的編碼器把對象進行序列化和反序列化,以便進行並處理並通過網絡傳輸。
3、自動模式發現
要從RDD創建DataFrame,必須提供一個模式。而從JSON、Parquet和ORC文件創建DataFrame時,會自動發現一個模式,包括分區的發現。

實踐

在pyspark shell或spark-shell中,會自動創建一個名爲spark的預配置SparkSession。
從Spark 2.0及更高的版本,SparkSession成爲關係型功能的入口點。當使用Hive時,SparkSession必須使用enableSupport方法創建,用來訪問Hive Metastore、SerDes和用戶自定義的函數。

創建DataFrame有三種方式:

1、從結構化數據文件創建DataFrame

2、從RDD創建DataFrame
3、從Hive中的表中創建DataFrame

把DataFrame轉換爲RDD非常簡單,只需要使用.rdd方法

常用方法的示例

1、DS與DF的關係
type DataFrame = Dataset[Row]
2、加載txt數據
val rdd = sc.textFile("data")

val df = rdd.toDF()
這種直接生成DF,df數據結構爲(查詢語句:df.select("*").show(5))

只有一列,屬性爲value。
3、 df.printSchema()

4、使用反射推斷模式

小結

小強從DataFrame和Dataset演變以及爲什麼使用他們,還有對於DataFrame和Dataset創建和互相轉換的一些實踐例子進行介紹,當時這些都是比較基礎的。深入學習Spark SQL需要了解更多Spark SQL提供的方法。後續小強爲大家帶來Saprk SQL相關方法以及優化。

【關注】和【點贊】是對小強最大的支持!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章