Spark深入解析(十九):SparkSQL之Spark SQL概述

Spark SQL官方介紹

官網

  http://spark.apache.org/sql/

在這裏插入圖片描述

什麼是Spark SQL

  Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了2個編程抽象:DataFrame和DataSet,並且作爲分佈式SQL查詢引擎的作用。

  我們已經學習了Hive,它是 將Hive SQL轉換成MapReduce然後提交到集羣上執行,大大簡化了編寫MapReduc的程序的複雜性 ,由於MapReduce這種計算模型執行效率比較慢。所有Spark SQL的應運而生,它是將Spark SQL轉換成RDD,然後提交到集羣執行,執行效率非常快!

Spark SQL的特點

1、易整合

  • 可以使用java、scala、python、R等語言的API操作。
    在這裏插入圖片描述

2、統一的數據訪問方式

  • 連接到任何數據源的方式相同。
    在這裏插入圖片描述

3、兼容Hive

  • 支持hiveHQL的語法。
  • 兼容hive(元數據庫、SQL語法、UDF、序列化、反序列化機制)
    在這裏插入圖片描述

4、標準的數據連接

  • 可以使用行業標準的JDBC或ODBC連接。
    在這裏插入圖片描述

Spark SQL的優缺點

優點

  • 表達非常清晰, 比如說這段 SQL 明顯就是爲了查詢三個字段,條件是查詢年齡大於 10 歲的
  • 難度低、易學習。

缺點

  • 複雜分析,SQL嵌套較多:試想一下3層嵌套的 SQL維護起來應該挺力不從心的吧
  • 機器學習較難:試想一下如果使用SQL來實現機器學習算法也挺爲難的吧

Hive和Spark SQL

Hive是將SQL轉爲MapReduce

SparkSQL可以理解成是將SQL解析成’RDD’ + 優化再執行

在這裏插入圖片描述


Spark SQL數據抽象

兩種數據抽象

  • DataFrame
  • DataSet

什麼是 DataFrame

  DataFrame是一種以RDD爲基礎的帶有Schema元信息的分佈式數據集,類似於傳統數據庫的二維表格。
  除了數據以外,還記錄數據的結構信息,即schema。同時,與Hive類似,DataFrame也支持嵌套數據類型(struct、array和map)。從API易用性的角度上看,DataFrame API提供的是一套高層的關係操作,比函數式的RDD API要更加友好,門檻更低。
在這裏插入圖片描述


  上圖直觀地體現了DataFrame和RDD的區別。左側的RDD[Person]雖然以Person爲類型參數,但Spark框架本身不瞭解Person類的內部結構。而右側的DataFrame卻提供了詳細的結構信息,使得Spark SQL可以清楚地知道該數據集中包含哪些列,每列的名稱和類型各是什麼。DataFrame是爲數據提供了Schema的視圖。可以把它當做數據庫中的一張表來對待,DataFrame也是懶執行的。性能上比RDD要高,主要原因
優化的執行計劃:查詢計劃通過Spark catalyst optimiser進行優化。

在這裏插入圖片描述


如下示例:
在這裏插入圖片描述
在這裏插入圖片描述
  爲了說明查詢優化,圖中構造了兩個DataFrame,將它們join之後又做了一次filter操作。如果原封不動地執行這個執行計劃,最終的執行效率是不高的。因爲join是一個代價較大的操作,也可能會產生一個較大的數據集。如果我們能將filter下推到 join下方,先對DataFrame進行過濾,再join過濾後的較小的結果集,便可以有效縮短執行時間。而Spark SQL的查詢優化器正是這樣做的。簡而言之,邏輯查詢計劃優化就是一個利用基於關係代數的等價變換,將高成本的操作替換爲低成本操作的過程。

什麼是 DataSet

1)DataSet是保存了更多的描述信息,類型信息的分佈式數據集。

2)與RDD相比,保存了更多的描述信息,概念上等同於關係型數據庫中的二維表。

3)與DataFrame相比,保存了類型信息,是強類型的,提供了編譯時類型檢查。

4)調用Dataset的方法先會生成邏輯計劃,然後被spark的優化器進行優化,最終生成物理計劃,然後提交到集羣中運行

在這裏插入圖片描述


DataSet包含了DataFrame的功能,
Spark2.0中兩者統一,DataFrame表示爲DataSet[Row],即DataSet的子集。
DataFrame其實就是Dateset[Row]。

在這裏插入圖片描述


RDD、DataFrame、DataSet的區別

結構圖解
在這裏插入圖片描述


RDD[Person]

  • 以Person爲類型參數,但不瞭解 其內部結構。

DataFrame

  • 提供了詳細的結構信息schema列的名稱和類型。這樣看起來就像一張表了

DataSet[Person]

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