《從0到1學習Spark》–DataFrame和Dataset探秘

  • 2019 年 10 月 6 日
  • 筆記

昨天小強帶着大家了解了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相關方法以及優化。