跳轉到主要內容
工程的博客

準時飛行性能與GraphFrames Apache火花

分享這篇文章

介紹

圖結構是許多類的數據更直觀的方法問題。社交網絡是否遍曆、餐廳推薦或飛行路徑,更容易理解這些數據問題的上下文中圖結構:頂點,邊和屬性。例如,飛行數據的分析是一個經典的圖問題機場表示頂點和航班是由邊緣。,有很多屬性與這些航班包括但不限於起飛延誤,飛機類型和載體。

在這篇文章中,我們將使用GraphFrames(最近宣布的引入GraphFrames)在磚筆記本可以快速、方便地分析飛行性能數據的組織圖結構。因為我們使用圖結構,我們可以很容易地問一些問題,沒有直觀的表格結構如發現結構圖案,機場排名的PageRank,城市之間的最短路徑。GraphFrames杠杆率的分布和表達能力DataFrame API來簡化你的查詢和利用Apache火花的性能優化的SQL引擎。此外,GraphFrames圖分析可以在Python中,Scala和Java。

安裝GraphFrames火花包

使用GraphFrames,你首先需要安裝GraphFrames火花包。安裝包磚是幾個簡單的步驟(加入β候補名單嚐試為自己)。

注意,內部參考GraphFrames spark-shell pyspark,或spark-submit:

SPARK_HOME美元/bin/spark-shell——包graphframes: graphframes:0.10-spark1。6

準備飛行數據集

構成我們的兩套數據圖機場數據集(頂點),可以發現OpenFlights機場,航空公司和路由數據departuredelays數據集(邊緣),可以發現航空公司準時性能和航班延誤的原因:On_Time數據

安裝好後GraphFrames火花包,您可以導入並創建頂點,邊,GraphFrame (PySpark)如下表示。

#進口graphframes(從Spark-Packages)
從graphframes進口*

#創建頂點(機場)和邊(航班)
tripVertices =機場。withColumnRenamed(“國際航空運輸協會”、“id”) .distinct ()
tripEdges = departureDelays。選擇(“tripid”、“延遲”,“src”、“夏時製”,“city_dst”、“state_dst”)

#這GraphFrame構建在頂點和邊基於我們的旅行(航班)
tripGraph = GraphFrame (tripVertices tripEdges)

例如,tripEdges包含了飛行數據確定起源國際航空運輸協會機場代碼(src)和目的地國際航空運輸協會機場代碼(dst),城市(city_dst),狀態(state_dst)以及起飛延誤(延遲)。

tripEdges

簡單查詢tripGraph GraphFrame

現在您已經創建了您tripGraph GraphFrame,您可以運行一些簡單的查詢快速遍曆和理解你的GraphFrame。例如,要了解機場和旅行的數量在你GraphFrame,運行下麵PySpark代碼。

打印”機場:% d % tripGraph.vertices.count ()
打印”旅行:% d % tripGraph.edges.count ()

它返回的輸出:

機場:279旅行:1361141

因為GraphFrames DataFrame-based火花圖,您可以編寫高度表達查詢利用DataFrame API。例如,下麵的查詢允許我們過濾(邊緣)航班延誤航班(延遲> 0)來自舊金山機場,我們計算和排序的平均延遲,即。什麼航班離開舊金山最有可能產生重大延誤?

tripGraph.edges \
.filter (“src =“舊金山”和延遲> 0 ")\
.groupBy (“src”、“dst”) \
.avg \(“延遲”)
.sort (desc (avg(延遲)))

評審輸出,您將快速識別有重要的平均延誤將羅傑斯世界機場(俄),傑克遜霍爾(江淮)和科羅拉多斯普林斯(COS) SFO在這個數據集。

SFO-significant-delays

磚的筆記本電腦,我們還可以快速可視化地理位置:什麼目的地國家往往有明顯的延遲離開海嗎?

SEA-delays-by-state-map

使用主題發現了解航班延誤

更容易地理解城市機場和航班的複雜關係,我們可以使用主題找到機場的模式(即頂點)連接的航班(即邊緣)。的結果是一個DataFrame列名有圖案的鑰匙。

例如,要問的問題我們延遲可能歸咎於SFO什麼呢?,您可以生成下麵的簡化的主題。

主題= tripGraphPrime.find (“(a) - (ab) - > (b);(b) - (bc) - > (c)) \
.filter (“(b。id =“舊金山”)和(ab.delay > 500或bc.delay > 500)和bc。tripid > ab.tripid和bc。tripid > ab.tripid + 10000”)
顯示器(主題)

與SFO作為連接城市(b),我們正在尋找所有航班(ab)從任何來源城市(a)之前,將連接到舊金山(b) (bc)飛往任何目的地城市(c)。我們也過濾它,推遲航班((ab)或(bc))大於500分鍾和第二飛行(bc)發生在大約一天的第一次飛行(ab)。

下麵是一個簡略子集從這個查詢列是各自的主題的鑰匙。

一個 ab b 公元前 c
休斯頓(IAH) IAH - > 4 (SFO)
[1011126]
舊金山(SFO) 舊金山- >肯尼迪(536)
[1021507]
紐約(肯尼迪)
圖森市(摘要) 摘要- > 5 (SFO)
[1011126]
舊金山(SFO) 舊金山- >肯尼迪(536)
[1021507]
紐約(肯尼迪)

與這個主題發現查詢,我們很快決定,乘客在這個數據集離開休斯頓和圖森市舊金山準時或者提前一點[1011126]。但是對於那些乘客,通過這個轉機飛往紐約在舊金山[1021507],他們推遲了536分鍾。

利用PageRank尋找最重要的機場

因為GraphFrames是建立在GraphX,有很多內置的算法,我們可以利用。網頁排名是由Google搜索引擎推廣的和由拉裏•佩奇。引用維基百科:

PageRank是通過計算一個頁麵的鏈接的數量和質量來確定一個粗略的估計的網站是多麼的重要。潛在的假設是,更重要的是網站可能會獲得更多從其他網站的鏈接。

在上麵的例子中是指網頁,這一概念有什麼可怕的是它很容易適用於任何圖結構是否創建的網頁,自行車,或者機場和接口調用方法一樣簡單。您還會注意到,GraphFrames將返回網頁排名的結果作為一個新列添加到頂點DataFrame跑後為一種簡單的方式來繼續我們的分析算法。

有大量的航班並通過各種連接機場包含在這個數據集,我們可以使用網頁排名算法有火花迭代遍曆圖計算的粗略估計每個機場是多麼的重要。

使用網頁排名#確定機場排名的重要性
排名= tripGraph.pageRank (resetProbability = 0.15,麥克斯特= 5)

顯示器(ranks.vertices.orderBy (ranks.vertices.pagerank.desc ()) .limit (20))

正如下麵的圖表,使用網頁排名算法,亞特蘭大機場被認為是最重要的一個基於連接的質量(如航班)之間的不同的頂點(機場);對應於這一事實亞特蘭大是世界上最繁忙的機場客運量

airport-ranking-pagerank-id

確定航班中轉

有如此多的不同城市之間的航班,您可以使用GraphFrames.bfs(廣度優先搜索)方法找到兩個城市之間的路徑。下麵的查詢試圖找到舊金山之間的路徑(SFO)和水牛(BUF) 1(我的最大路徑長度。e直接飛行)。結果集是空的(即和BUF SFO)之間沒有直飛航班。

filteredPaths = tripGraph.bfs (
fromExpr = " id =“舊金山”,
toExpr = " id =“緩衝區”,
maxPathLength = 1)
顯示器(filteredPaths)

讓我們有一個擴展查詢maxPathLength = 2之間有一個轉機,SFO和緩衝區。

filteredPaths = tripGraph.bfs (
fromExpr = " id =“舊金山”,
toExpr = " id =“緩衝區”,
maxPathLength = 2)
顯示器(filteredPaths)

一個簡略的子集路徑從舊金山到緩衝區中可以看到下麵的表。

v1
舊金山 MSP(明尼阿波利斯) 緩衝區
舊金山 英文文宣寫作研習營(紐瓦克) 緩衝區
舊金山 肯尼迪(紐約) 緩衝區
舊金山 奧德(芝加哥) 緩衝區
舊金山 ATL(亞特蘭大) 緩衝區
舊金山 拉斯維加斯(拉斯維加斯) 緩衝區
舊金山 BOS(波士頓) 緩衝區

使用D3可視化飛行

得到一個強大的可視化的飛行路徑和連接在這個數據集,我們可以利用機場D3可視化在我們的磚筆記本。通過連接我們GraphFrames DataFrames, D3可視化,我們可以想象所有的航班中轉的範圍如下指出準時或提前離開的航班在這個數據集。藍色的圓圈表示的頂點即機場圓圈代表邊的數量的大小即航班的機場。黑色線條的邊緣本身即航班和各自連接到另一個頂點即機場。注意畫麵以外的任何邊緣,他們是代表頂點即機場在美國夏威夷和阿拉斯加。

https://www.youtube.com/watch?v=riJGOmKF3Bs

免費試著磚
看到所有工程的博客的帖子
Baidu
map