Spark SQL是Spark用于結構化數據處理的模塊,前身是Shark。Shark基于Hive開發,雖提升了SQL-on-Hadoop效率,但對Hive依賴過多。2014年6月1日Shark項目停止開發,團隊將資源投入Spark SQL項目。Spark SQL具有諸多優點,如擺脫對Hive依賴、支持多種數據源、有多種性能優化技術、組件可擴展等
Spark SQL是對Spark Core的封裝,老版本中有SQLContext和HiveContext兩種SQL查詢起始點,SparkSession是最新SQL查詢起始點,是SQLContext和HiveContext的組合
Spark SQL特點包括:
易整合:無縫整合SQL查詢和Spark編程
統一的數據訪問:使用相同方式連接不同數據源
兼容 Hive:在已有倉庫上可直接運行SQL或HQL
標準數據連接:通過JDBC或ODBC連接
DataFrame是一種以RDD為基礎的分布式數據集,帶有schema元信息。與RDD相比,Spark SQL能更好優化其執行計劃,提升運行效率。DataFrame類似于傳統數據庫中的二維表格,支持嵌套數據類型,API友好,門檻較低
DataSet是Spark1.6中添加的新抽象,是DataFrame的擴展。它是分布式數據集合,提供RDD的優勢以及Spark SQL優化執行引擎的優點,是強類型的,可以用樣例類定義結構信息,用戶友好的API風格兼具類型安全檢查和查詢優化特性,還可以使用功能性轉換操作
SparkSession是Spark SQL的入口,創建DataFrame有三種方式:
通過Spark的數據源進行創建,如讀取json文件?
從一個存在的RDD進行轉換
從Hive Table進行查詢返回?
讀取JSON文件創建DataFrame后,可對DataFrame創建臨時表或全局表,然后通過SQL語句實現查詢全表等操作
DataFrame的DSL語法包括: ??
創建DataFrame,如通過?spark.read.json?方法讀取json文件
查看DataFrame的Schema信息,使用?printSchema?方法?
查看指定列數據,如?select?方法?
涉及運算時,列需使用?$?或引號表達式
過濾數據使用?filter?方法,分組統計使用?groupBy?和?count?方法
RDD與DataFrame轉換需注意:
RDD轉換為DataFrame需引入?spark.implicits._?,可通過樣例類或直接操作實現
DataFrame轉換為RDD可直接獲取內部的RDD
創建DataSet有兩種方式:?
使用樣例類序列創建,如?Seq(Person("zhangsan",2)).toDS()?
使用基本類型的序列創建,如?Seq(1,2,3,4,5).toDS?
RDD與DataSet轉換需要注意: ?
SparkSQL能自動將含有case類的RDD轉換成DataSet?
DataSet轉換為RDD可直接獲取內部RDD
DataFrame和DataSet轉換方法:
DataFrame可轉換為DataSet,如?df.asUser?
DataSet可轉換為DataFrame,如?ds.toDF?
RDD、DataFrame、DataSet三者的關系:
共性:都是Spark平臺下的分布式彈性數據集,有惰性機制、共同函數、自動緩存運算、分區概念,DataFrame和DataSet可使用模式匹配獲取字段值和類型
區別:RDD:一般與spark mllib同時使用,不支持sparksql操作
DataFrame:每一行類型固定為Row,不支持spark mllib操作,支持sparksql操作和一些保存方式
DataSet:和DataFrame擁有相同成員函數,區別在于行數據類型,DataFrame是DataSet的特例