Spark SQL概述

(一)數據分析方式

1.命令式

在前面的 RDD 部分, 非常明顯可以感覺的到是命令式的, 主要特徵是通過一個算子, 可以得到一個結果, 通過結果再進行後續計算.

<code>sc.textFile("...")

.flatMap(_.split(" "))

.map((_, 1))

.reduceByKey(_ + _)

.collect()/<code>


●命令式的優點

操作粒度更細, 能夠控制數據的每一個處理環節

操作更明確, 步驟更清晰, 容易維護

支持半/非結構化數據的操作

●命令式的缺點

需要一定的代碼功底

寫起來比較麻煩

2.SQL

對於一些數據科學家/數據庫管理員/DBA, 要求他們為了做一個非常簡單的查詢, 寫一大堆代碼, 明顯是一件非常殘忍的事情, 所以 SQL on Hadoop 是一個非常重要的方向.

<code>SELECT

name,

age,

school

FROM students

WHERE age > 10/<code>


●SQL的優點

表達非常清晰, 比如說這段 SQL 明顯就是為了查詢三個字段, 又比如說這段 SQL 明顯能看到是想查詢年齡大於 10 歲的條目

●SQL的缺點

想想一下 3 層嵌套的 SQL, 維護起來應該挺力不從心的吧

試想一下, 如果使用 SQL 來實現機器學習算法, 也挺為難的吧

3.總結

SQL 擅長數據分析和通過簡單的語法表示查詢, 命令式操作適合過程式處理和算法性的處理.

在 Spark 出現之前, 對於結構化數據的查詢和處理, 一個工具一向只能支持 SQL 或者命令式, 使用者被迫要使用多個工具來適應兩種場景, 並且多個工具配合起來比較費勁.

而 Spark 出現了以後, 統一了兩種數據處理範式, 是一種革新性的進步.

因為 SQL 是數據分析領域一個非常重要的範式, 所以 Spark 一直想要支持這種範式, 而伴隨著一些決策失誤, 這個過程其實還是非常曲折的.

(二)SparkSQL前世今生

1. 發展歷史


Spark SQL概述


●Hive

解決的問題

Hive 實現了 SQL on Hadoop, 使用 MapReduce 執行任務

簡化了 MapReduce 任務

新的問題

Hive 的查詢延遲比較高, 原因是使用 MapReduce 做計算

●Shark

解決的問題

Shark 改寫 Hive 的物理執行計劃, 使用 Spark 作業代替 MapReduce 執行物理計劃

使用列式內存存儲

以上兩點使得 Shark 的查詢效率很高

新的問題

Shark 重用了 Hive 的 SQL 解析, 邏輯計劃生成以及優化, 所以其實可以認為 Shark 只是把 Hive 的物理執行替換為了 Spark 作業

執行計劃的生成嚴重依賴 Hive, 想要增加新的優化非常困難

Hive 使用 MapReduce 執行作業, 所以 Hive 是進程級別的並行, 而 Spark 是線程級別的並行, 所以 Hive 中很多線程不安全的代碼不適用於 Spark

由於以上問題, Shark 維護了 Hive 的一個分支, 並且無法合併進主線, 難以為繼

在2014年7月1日的Spark Summit上,Databricks宣佈終止對Shark的開發,將重點放到Spark SQL上。

●SparkSQL-DataFrame

解決的問題

Spark SQL 使用 Hive 解析 SQL 生成 AST 語法樹, 將其後的邏輯計劃生成, 優化, 物理計劃都自己完成, 而不依賴 Hive

執行計劃和優化交給優化器 Catalyst

內建了一套簡單的SQL解析器, 可以不使用HQL, 此外, 還引入和 DataFrame 這樣的DSL API, 完全可以不依賴任何 Hive 的組件

Shark 只能查詢文件, Spark SQL 可以直接將查詢作用於 RDD, 這一點是一個大進步

新的問題

對於初期版本的SparkSQL, 依然有挺多問題, 例如只能支持SQL的使用, 不能很好的兼容命令式, 入口不夠統一等

●SparkSQL-Dataset

SparkSQL 在 1.6 時代, 增加了一個新的 API, 叫做 Dataset, Dataset 統一和結合了 SQL 的訪問和命令式 API 的使用, 這是一個劃時代的進步

在 Dataset 中可以輕易的做到使用 SQL 查詢並且篩選數據, 然後使用命令式 API 進行探索式分析

2. 注意:區分Hive和SparkSQL

Hive是將SQL轉為MapReduce

SparkSQL可以理解是將SQL轉為RDD + 優化再執行

Spark SQL概述


3. 總結: SparkSQL 是什麼

SparkSQL 是一個為了支持 SQL 而設計的工具, 但同時也支持命令式的 API

Spark SQL概述

(三) 數據分類和SparkSQL適用場景

1.結構化數據

一般指數據有固定的 Schema(約束), 例如在用戶表中, name 字段是 String 型, 那麼每一條數據的 name 字段值都可以當作 String 來使用

<code>+----+------------+---------------------------+-------+--------+
| id | name | url | alexa |country |
+----+------------+---------------------------+-------+--------+
| 1 | Google | https://www.google.cm/ | 1 | USA |
| 2 | 淘寶 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鳥教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | Facebook | https://www.facebook.com/ | 3 | USA |
+----+-------------+---------------------------+------+--------+/<code>

2.半結構化數據

一般指的是數據沒有固定的 Schema, 但是數據本身是有結構的

●沒有固定 Schema

指的是半結構化數據是沒有固定的 Schema 的, 可以理解為沒有顯式指定 Schema
比如說一個用戶信息的 JSON 文件, 第一條數據的 phone_num 有可能是 String, 第二條數據雖說應該也是 String, 但是如果硬要指定為 BigInt, 也是有可能的
因為沒有指定 Schema, 沒有顯式的強制的約束

●有結構

雖說半結構化數據是沒有顯式指定 Schema 的, 也沒有約束, 但是半結構化數據本身是有有隱式的結構的, 也就是數據自身可以描述自身


例如 JSON 文件, 其中的某一條數據是有字段這個概念的, 每個字段也有類型的概念, 所以說 JSON 是可以描述自身的, 也就是數據本身攜帶有元信息

<code>{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}/<code>

3.總結

●數據分類總結


Spark SQL概述

●Spark處理什麼樣的數據?

Spark 的 RDD 主要用於處理 非結構化數據 和 半結構化數據 結構化

SparkSQL中的SQL 主要用於處理 結構化數據(較為規範的半結構化數據也可以處理)

●SparkSQL 相較於 RDD 的優勢在哪?

SparkSQL 提供了更好的外部數據源讀寫支持

因為大部分外部數據源是有結構化的, 需要在 RDD 之外有一個新的解決方案, 來整合這些結構化數據源

SparkSQL 提供了直接訪問列的能力

因為 SparkSQL 主要用做於處理結構化數據, 所以其提供的 API 具有一些普通數據庫的能力

●總結:

SparkSQL 是一個既支持 SQL 又支持命令式數據處理的工具

SparkSQL 的主要適用場景是處理結構化數據(較為規範的半結構化數據也可以處理)

(四) Spark SQL官方介紹

●官網

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


Spark SQL概述

Spark SQL是Spark用來處理結構化數據的一個模塊,它提供了一個編程抽象叫做DataFrame(底層也是RDD)並且作為分佈式SQL查詢引擎的作用。

相比於Spark RDD API,Spark SQL包含了對結構化數據和在其上的運算的更多信息,Spark SQL使用這些信息進行了額外的優化,使對結構化數據的操作更加高效和方便。

Spark SQL還提供了多種使用方式,包括DataFrames API和Datasets API。但無論是哪種API或者是編程語言,它們都是基於同樣的執行引擎,因此你可以在不同的API之間隨意切換,它們各有各的特點,看你喜歡。

●Spark SQL 的特點

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

1.易整合

可以使用java、scala、python、R等語言的API操作。


Spark SQL概述

2.統一的數據訪問

連接到任何數據源的方式相同。


Spark SQL概述

3.兼容Hive

支持hiveHQL的語法。

兼容hive(元數據庫、SQL語法、UDF、序列化、反序列化機制)

Spark SQL概述

4.標準的數據連接

可以使用行業標準的JDBC或ODBC連接。


Spark SQL概述


分享到:


相關文章: