1. 程式人生 > >想學spark但是沒有叢集也沒有資料?沒關係,我來教你白嫖一個!

想學spark但是沒有叢集也沒有資料?沒關係,我來教你白嫖一個!

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注

今天是spark專題的第六篇文章,這篇文章會介紹一個免費的spark平臺,我們可以基於這個平臺做一些學習實驗。

databricks

今天要介紹的平臺叫做databricks,它是spark的建立者開發的統一分析平臺。單憑spark建立者這幾個字大家應該就能體會到其中的分量,其中集成了Scala、Python和R語言的環境,可以讓我們線上開發呼叫雲端的spark叢集進行計算。

最最關鍵的是,它提供免費的社群版本,每個開發者都可以獲得15GB記憶體的免費執行環境。非常適合我們初學者進行學習。

說來慚愧我也是最近才知道這麼一個平臺(感謝sqd大佬的分享),不然的話也不用在本地配置spark的環境了。下面簡單介紹一下databricks的配置過程,我不確定是否需要梯子,目測應該可以正常訪問。有知道的小夥伴可以在留言板裡評論一下。

首先,我們訪問:https://community.cloud.databricks.com/

然後點選註冊按鈕,建立新使用者:

跳轉之後會讓我們填寫一些個人的基本資訊,比如姓名、公司名稱、工作郵箱還有使用這個平臺的目的,等等。

我實際驗證過,這裡的公司沒有校驗,應該可以隨意填寫,比如你可以填tencent或者是alibaba都是可以的。工作郵箱我們可以留qq郵箱,並不會做公司郵箱字尾校驗,所以學生黨們可以不用擔心,假裝自己在某家心儀的公司就可以了。然後選一下目的這個也都很簡單大家自由選擇,選好了之後,我們點選sign up就好了。

這裡說明一下,如果留qq郵箱的話驗證郵件會被qq當做垃圾郵件放入垃圾箱,所以記得去垃圾箱裡檢視。然後我們點選郵件中的連結設定密碼就完成了。

配置環境

註冊好了之後,我們就可以進行愉快地使用了。首先我們建立一個新的叢集,點選選單欄左側的clusters然後選擇一下spark的版本填一下叢集的名稱即可。

spark的版本可以不用更改,填好名字之後點選create cluster即可。系統有一點點慢,稍微等一會再重新整理就會發現列表當中多了一個叢集。叢集的啟動需要一點時間,我們耐心等待即可。

等叢集建立好了之後, 我們就可以建立notebook進行愉快地編碼了。

我們點選home然後選擇自己的賬號,點選create notebook。

接著會有一個彈框讓我們選擇語言和叢集,這裡的語言我們選Python,如果你喜歡也可以換成Scala。叢集就選擇我們剛才建立的test叢集。

我們點選create之後就會自動開啟一個notebook的頁面,我們就可以在裡面編碼了。為了測試一下環境,我們輸入sc,看一下是否會獲得sparkContext。

image-20200517200340320

結果和我們預期一致,說明已經配置好了。以後我們就可以在這個叢集當中愉快地玩耍和實驗了。它除了自帶很多給初學者進行學習的資料集之外,還允許我們自己上傳檔案,可以說是非常良心了。

實驗

接下來我們利用這個平臺來進行一個spark sql的小實驗,來實際體會一下databricks和spark sql的強大。

我們這個實驗用到的資料是databricks自帶的資料集,一共用到兩份資料,分別是機場資訊的資料以及航班延誤的資料。我們要做的事情很簡單,就是將這兩份資料join在一起,然後觀察一下每一個機場延誤的情況。這份資料當中只有美國,所以對我們大多數人沒什麼價值,僅僅當做學習而已。

首先,我們通過相對路徑從databricks的資料集當中獲取我們需要的這兩份資料:

flightPerFilePath = "/databricks-datasets/flights/departuredelays.csv"
airportsFilePath = "/databricks-datasets/flights/airport-codes-na.txt"

databricks中的資料集都在databricks-datasets路徑下,我們可以通過這行程式碼檢視,你會發現這裡面數據集非常多,簡直是初學者的福音。

display(dbutils.fs.ls("/databricks-datasets"))

接著,我們用dataframe的api從路徑當中生成dataframe:

airports = spark.read.csv(airportsFilePath, header='true', inferSchema='true', sep='\t')
flightPerf = spark.read.csv(flightPerFilePath, header='true')

flightPerf.cache()

由於這兩份資料一份是csv一份是txt,所以讀取的時候格式有所區別。flight是csv檔案,我們直接讀取即可。而airports是txt檔案,所以我們需要指定分隔符,inferSchema這個引數表示系統會自動推斷它的schema。

我們讀取完之後,notebook會非常友好地把欄位的資訊一併輸出出來,我們可以看到欄位的名稱和它對應的型別。

接下來要做的就很簡單了,只需要將這兩者關聯到一起即可。我們觀察一下好像並沒有發現可以join的key,這是因為這份資料比較特殊,航班當中記錄機場的資訊並不是通過名稱,而是通過特定的程式碼,在資料集中這個欄位叫做origin,而機場資料也有同樣的程式碼,叫做IATA(國際運輸協會)。

我們想要將這兩份資料join在一起,然後把延誤的時間相加,看看哪些機場的延誤時間最多,按照延誤時間倒序排序。

這個需求如果用SQL寫很簡單,稍微瞭解過SQL語法的同學應該就可以寫出來:

select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc

但如果用上dataframe的api來實現則要麻煩得多。雖然程式碼量並不大,基於流式計算,嚴格說起來只有一行程式碼:

from pyspark.sql.functions import desc
airports.join(
  flightPerf, 
  airports.IATA == flightPerf.origin
).select('City', 'origin', 'delay')
.groupBy(['City', 'origin'])
.agg({'delay': 'sum'})
.withColumnRenamed('sum(delay)', 'Delays')
.orderBy(desc('Delays'))
.show()

雖然邏輯上和SQL完全一樣,但是寫起來還是要費勁一些。所以我們可以考慮將dataframe轉化成檢視,然後用SQL來操作它:

airports.createOrReplaceTempView('airports')
flightPerf.createOrReplaceTempView('FlightPerformance')

接著我們就可以呼叫spark.sql來傳入SQL程式碼進行資料處理了:

spark.sql("""
select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a 
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc"""
         ).show()

這樣明顯就方便了很多,還沒完,由於我們使用的是notebook,在notebook支援許多魔法操作,比如我們可以通過%sql來直接在其中寫一段SQL。notebook會自動將它轉化成dataframe的語句進行執行,不但如此,還可以以圖表的形式展示資料:

%sql

select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc

輸出的結果是這樣的:

不但如此,我們還可以在下方的選擇欄當中選擇我們想要的圖表展現形式。比如我們可以選擇餅圖:

還沒完,databricks當中還集成了地圖,比如我們想看一下美國各個州的資料,這個很容易寫出SQL:

%sql

select a.State, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.Country = 'USA'
group by a.State

得到的結果預設是以柱狀圖展示:

我們在圖表型別當中選擇map:

接下來就是見證奇蹟的時刻,會得到一張帶著資料的美國地圖,美國各個州的情況一覽無餘。

總結

今天的內容到這裡就結束了,關於databricks還有很多實用的功能,由於篇幅限制就不一一介紹了,大家感興趣的可以自己研究一下。

我個人覺得這個平臺非常出色,除了寫程式碼體驗以及資料視覺化做得非常好之外,功能強大,最關鍵還是免費的,非常適合我們學生黨以及個人學習使用。畢竟對於我們個人而言,擁有一個強大的spark叢集並不容易,希望大家都能用好這個平臺,有所收穫。

今天的文章就到這裡,原創不易,掃碼關注我,獲取更多精彩文章。

![](https://user-gold-cdn.xitu.io/2020/5/24/17244349282c8fb9?w=258&h=258&f=png&