想學spark但是沒有集群也沒有數據?沒關係,我來教你白嫖一個!

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

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

databricks

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

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

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

首先,我們訪問://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
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集群並不容易,希望大家都能用好這個平台,有所收穫。

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