## 一、概述
Hive 是將 SQL 轉為 MapReduce。
**SparkSQL 可以理解成是將 SQL 解析成:“RDD + 優化” 再執行**

在學習 Spark SQL 前,需要了解數據分類。
**數據分類**
數據分為如下幾類:
| | 定義 | 特點 | 舉例 |
| --- | --- | --- | --- |
| 結構化數據 | 有固定的 Schema | 有預定義的 Schema | 關系型數據庫的表 |
| 半結構化數據 | 沒有固定的 Schema,但是有結構 | 沒有固定的 Schema,有結構信息,數據一般是自描述的 | 指一些有結構的文件格式,例如 JSON |
| 非結構化數據 | 沒有固定 Schema,也沒有結構 | 沒有固定 Schema,也沒有結構 | 指圖片 / 音頻之類的格式 |
**總結:**
* **RDD** 主要用于處理非結構化數據 、半結構化數據、結構化;
* **Spark SQL** 是一個既支持 SQL 又支持命令式數據處理的工具;
* **Spark SQL** 主要用于處理結構化數據 (較為規范的半結構化數據也可以處理)。
### Spark SQL 數據抽象
#### DataFrame 和 DataSet
Spark SQL 數據抽象可以分為兩類:
**① DataFrame**:DataFrame 是一種以 RDD 為基礎的分布式數據集,類似于傳統數據庫的二維表格,帶有 Schema 元信息 (可以理解為數據庫的列名和類型)。DataFrame = RDD + 泛型 + SQL 的操作 + 優化
**② DataSet**:DataSet 是 DataFrame 的進一步發展,它比 RDD 保存了更多的描述信息,概念上等同于關系型數據庫中的二維表,它保存了類型信息,是強類型的,提供了編譯時類型檢查。調用 Dataset 的方法先會生成邏輯計劃,然后被 spark 的優化器進行優化,最終生成物理計劃,然后提交到集群中運行!DataFrame = Dateset\[Row\]
`RDD`、`DataFrame`、`DataSet`的關系如下:

* **RDD\[Person\]**:以 Person 為類型參數,但不了解其內部結構。
* **DataFrame**:提供了詳細的結構信息 schema 列的名稱和類型。這樣看起來就像一張表了。
* **DataSet\[Person\]**:不光有 schema 信息,還有類型信息。
#### 舉例
假設 RDD 中的兩行數據長這樣:
```
RDD[Person]:
```

那么 DataFrame 中的數據長這樣
```
DataFrame = RDD[Person] - 泛型 + Schema + SQL 操作 + 優化
```

那么 Dataset 中的數據長這樣:
```
Dataset[Person] = DataFrame + 泛型:
```

Dataset 也可能長這樣: Dataset[Row]:
```
即 DataFrame = DataSet[Row]:
```

**總結**:
- DataFrame = RDD - 泛型 + Schema + SQL + 優化
- DataSet = DataFrame + 泛型
- DataSet = RDD + Schema + SQL + 優化
## 二、SQLContext
SparkSQL中所有相關功能的入口點是[SQLContext](http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.SQLContext)類或者它的子類,
創建一個SQLContext的所有需要僅僅是一個SparkContext。
```scala
val sc: SparkContext // An existing SparkContext.
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// createSchemaRDD is used to implicitly convert an RDD to a SchemaRDD.
import sqlContext.createSchemaRDD
```
**除了一個基本的SQLContext,你也能夠創建一個HiveContext**,它支持基本SQLContext所支持功能的一個超集。它的額外的功能包括用更完整的HiveQL分析器寫查詢去訪問HiveUDFs的能力、從Hive表讀取數據的能力。用HiveContext你不需要一個已經存在的Hive開啟,SQLContext可用的數據源對HiveContext也可用。HiveContext分開打包是為了避免在Spark構建時包含了所有的Hive依賴。如果對你的應用程序來說,這些依賴不存在問題,Spark 1.2推薦使用HiveContext。以后的穩定版本將專注于為SQLContext提供與HiveContext等價的功能。
用來解析查詢語句的特定SQL變種語言可以通過`spark.sql.dialect`選項來選擇。這個參數可以通過兩種方式改變,一種方式是通過`setConf`方法設定,另一種方式是在SQL命令中通過`SET key=value`來設定。對于SQLContext,唯一可用的方言是“sql”,它是Spark SQL提供的一個簡單的SQL解析器。在HiveContext中,雖然也支持"sql",但默認的方言是“hiveql”。**這是因為HiveQL解析器更完整。在很多用例中推薦使用“hiveql”。**
- Introduction
- 快速上手
- Spark Shell
- 獨立應用程序
- 開始翻滾吧!
- RDD編程基礎
- 基礎介紹
- 外部數據集
- RDD 操作
- 轉換Transformations
- map與flatMap解析
- 動作Actions
- RDD持久化
- RDD容錯機制
- 傳遞函數到 Spark
- 使用鍵值對
- RDD依賴關系與DAG
- 共享變量
- Spark Streaming
- 一個快速的例子
- 基本概念
- 關聯
- 初始化StreamingContext
- 離散流
- 輸入DStreams
- DStream中的轉換
- DStream的輸出操作
- 緩存或持久化
- Checkpointing
- 部署應用程序
- 監控應用程序
- 性能調優
- 減少批數據的執行時間
- 設置正確的批容量
- 內存調優
- 容錯語義
- Spark SQL
- 概述
- SparkSQLvsHiveSQL
- 數據源
- RDDs
- parquet文件
- JSON數據集
- Hive表
- 數據源例子
- join操作
- 聚合操作
- 性能調優
- 其他
- Spark SQL數據類型
- 其它SQL接口
- 編寫語言集成(Language-Integrated)的相關查詢
- GraphX編程指南
- 開始
- 屬性圖
- 圖操作符
- Pregel API
- 圖構造者
- 部署
- 頂點和邊RDDs
- 圖算法
- 例子
- 更多文檔
- 提交應用程序
- 獨立運行Spark
- 在yarn上運行Spark
- Spark配置
- RDD 持久化