打印 上一文章 下一文章

[麻瓜科技] Lec02分析工具篇 :Spark 的處理

[複製網址]
1

Lec02分析工具篇 :Spark 的處理這節我們要介紹 Spark 處理 batch
資料的神器,SparkSQLSQL 可以說是任何一位資料科學家的基本能力之一SQL 提供了高階且標準的查詢語言可以查詢,操作數據,同時也可以定義資料並且控制管理資料庫SQL 的優點在於高度的抽象,能使用接近自然語言的語法不管在任何平台上的
SQL 都有統一的風格因此使用 SQL 時更能專注於要做的事情而不用管底層怎麼運作正式進入
SparkSQL 前,我先幫各位複習一下 SQL 的基本結構那這絕對比任何你學過的程式語言像是Pyson或是C++還要簡單在做資料查詢時首先使用關鍵字 SELECT 來定義要選擇的資料欄位使用 FROM 代表要查詢的資料表單如果要合併兩個資料表單,則用 JOIN 表示要選擇的另外一個表並且加上 ON 代表要作為合併的鍵值那可以用 WHERE 來篩選則料,符合條件的會被選取如果要做聚合例如
sum,count,需要用 GROUP 代表要聚合的層級同時也可以使用 ORDER 來將資料排序並且用 LIMIT 來限制輸出的資料筆數Spark SQL並不只是SQL它可以做的事情是可以比SQL多更多的SparkSQL 的設計理念就是要寫更少的 Code然後使用更少的資料操作手續將複雜的工作簡化那之前我們有Spark
RDD的操作方式雖然不難但是對於完全沒程式基礎的人來說,要能寫好還是有難度那為了讓更多人可以透過 Spark 來操作巨量資料SparkSQL 的發展策略是相當的明顯而且必要的透過
SQL 這種標準資料操作語言可以讓原本熟悉資料庫的人員以比較無痛的方式轉移到 SparkSQL 上同時也能將比較不易看懂的
RDD 操作程式碼轉換成 SQL 語言那SparkSQL
提供了多種操作策略除了使用 SQL 語言外,也可以使用 Dataframe
以及 RDD 的操作方式讓實作上以及資料操作上更為的靈活大數據的特點之一就是資料來源也相當的多元那SparkSQL 設計上也有考量到如何與不同資料源做鍵接例如像是S3,
HDFS, Cassandra或者像是不同的資料格式像是Json, Parquet, csv都可以透過
Spark SQL來讀取那這些異質資料源可以透過 Spark轉為 Dataframe統一的方式來操作Spark
本身不具有資料庫管理系統但是可以透過 Hive metastore 來管理資料包括建立資料庫,建立資料表格,以及讀取資料等等而SparkSQL
也有提供對應的 JDBC以及ODBC Driver可以讓其他 BI
工具將 SparkSQL 當成運算引擎,撈取海量的數據SparkSQL 雖然是由Scala
開發但是對於開發者來說是相當的友善提供了各種的語言接口來處理各種不同的資料來源那例如像Spark SQL這邊除了使用SQL操作之外也可以使用Pyson, Scala, Java來做操作那我們來簡單來看一下
SparkSQL 怎麼做到這些的不論你是使用的是 SQL,Dataframe 或是Scala的DatastetsSparkSQL
都會將操作轉換成 RDD 操作而 RDD
的資料來源就包括前面提到 HDFS, Cassandra 等SparkSQL
提供不同資料來源的 API 與其對接中間 SparkSQL
雲平台提供雲端服務公司,其高效及高可用性的解決方案SmartCLOUD™ Compute。
使用一種他們稱之為 Catalyst 的方式將輸入的操作轉為 RDD
的操作我們來看一下Catalyst的這一塊當使用者輸入操作指令時SparkSQL 會做以下這幾件事情包含了分析,邏輯優化,產生多個物理計劃以及判斷最佳物理計劃之後,產生最佳對應的 RDD 操作那以下來分別介紹這幾個階段當使用者輸入
SQL 之後會有 SQL Parser
將 SQL 語句轉換成抽象的語法樹接着會去找到相關依賴的源頭例如有沒有該表格那該表格裏有沒有那個欄位以及找到欄位後會給予一個唯一識別 id
供後續來使用並且會驗證欄位的型態是不是合法我們這邊舉個例子例如我在Spark SQL這邊找到查詢一個不存在的表格這時候Spark SQL就會爆錯來顯示說這個表格並不存在那這個階段是在第一個分析階段那在邏輯最佳化這邊會根據幾個原則將操作邏輯最佳化例如當資料來源為 relational
database 的時候在篩選資料就會將篩選這個動作下推到資料源來減少資料傳輸如果資料來源是 Parquet 格式的話會夠過字串將字典編碼成整數來縮減資料量Spark
會依據邏輯最佳化的結果產生一個或多個相對應能夠被 Spark 執行的物理計劃消耗最佳化模型將從這些物理計劃中選擇適當的 Join
方案例如是廣播的join 或者是 shuffle join來減少網絡傳輸量同時也會減少虛擬函數的使用量最後這個最佳化的物理計劃就會產生
JVM bytecode,被 Spark 執行那Spark
在進入 2.x 版後也針對編譯器下了一番功夫來加速運算例如這個簡單的
Filter 加Count 的動作在過去Spark 1.
x 的時候採用的是標準的做法在傳統的做法會寫一段 Filter 物件來符合各種數據類型以及判斷資料那這樣做法的優點是可以任意組合計算值也不用擔心數據類型但是今天我們嘗試使用另外一種手寫程式碼的方式如果你今天你拿到一支程式碼要你在10分鐘之內寫出這樣的式子select
count from一個store sales然後有個篩選條件ss item
sk 要等於1000的時候你會怎麼開始來寫呢Spark 2.x
版採用這種手寫代碼的風格來處理原因就在於手寫代碼沒有虛擬函數看到左邊的例子當我使用手寫代碼的時候我就去用迴圈掃一遍資料庫當資料符合我們的條件的時候count就加1這樣簡單的迴圈以及判斷可以在CPU裏面直接運算充分的利用硬件資源下表會顯示優化後的結果在各種功能上包含了filter, sum, hash join的部份都有顯著的進步那我們來看一下一個自動優化的範例當我們輸入一個資料user是join跟event這兩個表格然後當user
id 會等於event id的時候同時另外還要做一個filter查詢這邊要做的事情就是將event 和
users 這兩個表格join然後並且篩選出data 大於2015–01–01的資料從語句上來說的順序是挑出 users
和 events 這兩個表格接着join 這兩個表格,然後篩選資料但是經過了邏輯計劃的優化之後到了物理計劃時在掃描
events 這個表格的時候就會先篩選出對應的資料,接着才進行兩個表格的 join這會大幅減省資料傳輸以及 join
的量比起自己操作 RDD使用 Datafram 或者是
SparkSQL 的效能明顯增加一倍而且不論使用 Scala 或是
Pyspark都沒有明顯的差別那我們來看一下Pyspark SQL 的語法讀取資料時可以用統一的 API
接口讀取各式的資料格式及來源那在這邊的例子來說透過Spark .read之後就可以接各種資料像是csv, jason,
table或是jdbc, parquet等等那在讀取jason資料的時後,Spark會很聰明的幫你判斷包含了像age以及name那在Dataframe操作的時候可以選擇使用操作值或者是SQL 語法像我這邊我要去選擇name的欄位在操作值的語法的時候在左邊的表格df.select裏面加上你要選擇的欄位名稱.
show就可以將資料顯示出來那如果你要將資料轉成table來使用的話也可以透過crete or replace or
build來建立一個虛擬暫時的SQL表格接着就可以透過Spark.SQL裏面加上AQL語句來對這個表格做存取那Spark也支援各式各樣的輸出格式那在這邊可以選擇是要 append 還是
overwrite資料Spark SQL在write的同時,我可以選擇要存成csv資料或者透過jdbc存到其他資料源Spark SQL因此最常被拿來作為 ETL
的工具或是取代 Hive 作為最基本的SQL 查詢工具

相關推薦:
利用函數RANK.EQ來計算成績排名哈囉,大家好說到成績排名有些人也許會聯想到 Excel 的排序功能譬如今天我想要了解班上同學的名次高低那麼我可以將滑鼠游標置於「成績」欄之後按下「從最大到最小排序」的按鈕只是這個操作會將整個表格重新洗牌導致原本依照「學號」排列的成績單整個被...
從此寫公式變得宇宙無敵簡單!哈囉,大家好一直以來 Excel 的函數都有一個特性就是一個公式只傳回一個數值譬如我們可以使用 VLOOKUP 函數以「學號」查詢某個同學的「姓名」但是 VLOOKUP卻無法用「班級」做為篩選條件來找出班上有那些學生不過這一切的限制已成為過...
雲端運算服務計畫對企業的發展重要性親愛的聽眾朋友大家好,我是文馨歡迎收聽中小企業通節目禮拜二的單元數位一點通我們現在這個單元持續跟大家來分享對我們企業的發展重要性以及效益雲端服務、雲端運用很多的企業朋友越來越了解運用雲端服務對企業的好所以對自己的產業也想要了解究竟適不適合來...
收藏收藏 推 噓
您需要登錄後才可以回文 登錄 | 註冊

本版透可值規則

快速回覆 返回頂部 返回列表