Spark SQL概述html
做者:尹正傑sql
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。數據庫
一.什麼是Spark SQLapache
Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了2個編程抽象:DataFrame和DataSet,而且做爲分佈式SQL查詢引擎的做用。
Hive是將Hive SQL轉換成MapReduce而後提交到集羣上執行,大大簡化了編寫MapReduc的程序的複雜性。
因爲MapReduce這種計算模型執行效率比較慢。全部Spark SQL的應運而生,它是將Spark SQL轉換成RDD,而後提交到集羣執行,執行效率很是快!
舒適提示:
早期spark名稱爲"shark",故名意思,早期的spark版本主要以Hive SQL轉換成RDD,但因爲Hive是基於MapReduce模型研發的,而MapReduce的發展速度相對較慢這間接致使Hive的發展速度也緩慢。
因爲Hive的發展速度較慢,因而Shark就模仿Hive的功能編寫了本身的SQL,以後的版本都是基於自研的SQL來轉換RDD,故shark改名爲spark,固然如今的Spark版本也支持與Hive集成。
二.Spark SQL的特色編程
博主推薦閱讀: http://spark.apache.org/sql/
三.什麼是DataFrame安全
與RDD相似,DataFrame也是一個分佈式數據容器。
然而DataFrame更像傳統數據庫的二維表格,除了數據之外,還記錄數據的結構信息,即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進行優化。
四.什麼是DataSet框架
是Dataframe API的一個擴展,是Spark最新的數據抽象。 用戶友好的API風格,既具備類型安全檢查也具備Dataframe的查詢優化特性。 Dataset支持編解碼器,當須要訪問非堆上的數據時能夠避免反序列化整個對象,提升了效率。 樣例類被用來在Dataset中定義數據的結構信息,樣例類中每一個屬性的名稱直接映射到DataSet中的字段名稱。 Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,因此能夠經過as方法將Dataframe轉換爲Dataset。Row是一個類型,跟Car、Person這些的類型同樣,全部的表結構信息我都用Row來表示。 DataSet是強類型的。好比能夠有Dataset[Car],Dataset[Person]. DataFrame只是知道字段,可是不知道字段的類型,因此在執行這些操做的時候是沒辦法在編譯的時候檢查是否類型失敗的,好比你能夠對一個String進行減法操做,在執行的時候才報錯,而DataSet不只僅知道字段,並且知道字段類型,因此有更嚴格的錯誤檢查。就跟JSON對象和類對象之間的類比。
五.SparkSession新的起始點分佈式
在老的版本中,SparkSQL提供兩種SQL查詢起始點:
SQLContext:
用於Spark本身提供的SQL查詢。
HiveContext:
用於鏈接Hive的查詢。
SparkSession是Spark最新的SQL查詢起始點,實質上是SQLContext和HiveContext的組合,因此在SQLContext和HiveContext上可用的API在SparkSession上一樣是可使用的。
SparkSession內部封裝了sparkContext,因此計算其實是由sparkContext完成的。
六.博主推薦閱讀函數
Spark SQL編程實戰案例: https://www.cnblogs.com/yinzhengjie2020/p/13185272.html