大數據帶你看穿航班晚點的套路

「我們很抱歉地通知您,您乘坐的由XX飛往XX的XXXX航班延誤。」

相信很多在機場等待飛行的旅客都不願意聽到這句話。隨著乘坐飛機這種交通方式的逐漸普及,航延延誤問題也一直困擾著我們。航班延誤通常會造成兩種結果,一種是航班取消,一種是航班晚點。

本節項目課中,讓我們一起來用大數據破解航班晚點的套路。

圖片來自pexels.com

本項目完整教程及在線練習地址:大數據帶你看穿航班晚點的套路(更多大數據項目請查看大數據工程師 - 學習路徑)

一、實驗說明

1. 內容簡介

在本課程中,我們將通過Spark提供的 DataFrame、 SQL 和機器學習框架等工具,結合數據可視化技術,對航班起降的記錄數據進行分析,嘗試找出造成航班延誤的原因,以及對航班延誤情況進行預測。

2. 知識點

  • Spark DataFrame操作

  • Spark SQL常用操作

  • Spark MLlib 機器學習框架使

3. 準備工作

(1)Spark應用基礎

本課程需要你具有一定的Spark基礎,以下為推薦在本課程之前需要學習的課程(已按先後順序進行排列):

  • Spark大數據動手實驗

  • Spark DataFrame入門

  • Spark DataFrame詳解

  • Spark 講堂之 SQL 入門

(2)準備草稿紙

在學習過程中,建議手邊能夠準備紙和筆做相應的記錄。代碼寫起來是非常快的,然而更重要的是如何通過思考去設計這些代碼。因此我們會有大量的工作在書寫偽代碼和記錄相關的欄位上。

這也是數據分析工作中常見的一個習慣。

4. 效果

由於是美國航班數據,最終結果用美國地圖呈現。用滑鼠指向每一個州,都能看到對應的詳細信息。圖中顏色最深的兩個州為 CA 和 TX 。一定程度上表明這兩個州的航空活動更加活躍。

二、問題設計

本節實驗用到的航班數據集是 2009 年 Data Expo 上提供的飛行準點率統計數據。

在探索數據之前,我們已經知道該數據共有29個欄位。根據出發時間、出發/抵達延誤時間等信息,我們可以大膽地提出下面這些問題:

  • 每天航班最繁忙的時間段是哪些?通常早晚都容易有大霧等極端天氣,是否中午的時候到港和離港航班更多呢?

  • 飛哪最準時?在設計旅行方案時,如果達到某個目的地有兩個相鄰的機場,我們似乎可以比較到哪裡更準時,以減少可能發生的延誤給我們出行帶來的影響。

  • 出發延誤的重災區都有哪些?同樣,從哪些地方出發最容易遭到延誤?下次再要從這些地方出發的時候,就要考慮是不是要改乘地面交通工具了。

請用一張紙記錄下上述問題。如果你還有自己想要探索的問題,也請記錄下來,稍後嘗試自己完成。

三、問題解答

圖片來自pexels.com

我們首先把數據註冊為臨時表,對於上述問題的解答實際上就變成了如何設計合適的 SQL 查詢語句。在數據量非常大的時候,Spark SQL 的使用尤為方便,它能夠直接從 HDFS 等分散式存儲系統中拉取數據進行查詢,並且能夠最大化地利用集群性能進行查詢計算。

3.1 每天航班最繁忙的時間段是哪些

分析某個問題時,要想辦法將解答問題的來源落實在數據集的各個指標上。當問題不夠詳細時,可以取一些具有代表性的值作為該問題的答案。

例如,航班分為到港(Arrive)和離港(Depart)航班,若統計所有機場在每天的某個時間段內離港航班數量,就能在一定程序上反映這個時段的航班是否繁忙。

那麼,當我們提到「統計……的數量」的時候,我們在說什麼?

數據集中的每一條記錄都樸實地反映了航班的基本情況,但它們並不會直接告訴我們每一天、每一個時段都發生了什麼。為了得到後者這樣的信息,我們需要對數據進行篩選和統計。

於是我們會順理成章地用到 AVG(平均值)、COUNT(計數)和 SUM(求和)等統計函數。

為了分時間段統計航班數量,我們可以大致地將一天的時間分為以下五段:

  • 凌晨(00:00 - 06:00):大部分人在這個時段都在休息,所以我們可以合理假設該時間段內航班數量較少。
  • 早上(06:01 - 10:00):一些早班機會選擇在此時間出發,機場也通常從這個時間段起逐漸進入高峰。
  • 中午(10:01 - 14:00):早上從居住地出發的人們通常在這個時候方便抵達機場,因此選擇在該時間段出發的航班可能更多。
  • 下午(14:01 - 19:00):同樣,在下午出發更為方便,抵達目的地是剛好是晚上,又不至於太晚,方便找到落腳之處。
  • 晚上(19:01 - 23:59):在一天結束之際,接近凌晨的航班數量可能會更少。

這樣的分段都是基於一些假設的。如果你認為你有更合理的分段方式,不妨將它們用到後續的分析工作中。

不要忘了在草稿紙上記錄下這些重要的時間段,在設計代碼時會用到它們。

當我們所需的數據不是單個離散的數據而是基於一定範圍的時候,我們可以用關鍵字 BETWEEN x AND y 來設置數據的起止範圍。

有了上述準備,我們可以嘗試寫出統計離港時間在 0 點 至 6 點 間的航班總數。首先選取的目標是 flights 這張表,即 FROM flights。航班總數可以對 FlightNum 進行統計(使用COUNT函數),即 COUNT(FlightNum)。限定的條件是離港時間在 0 (代表 00:00)至 600 (代表 6:00)之間,即 WHERE DepTime BETWEEN 0 AND 600。所以我們要寫出的語句是:

請在 Spark Shell 中輸入以下代碼。

val queryFlightNumResult = sqlContext.sql("SELECT COUNT(FlightNum) FROM flights WHERE DepTime BETWEEN 0 AND 600")n

查看其中 1 條結果。

請在 Spark Shell 中輸入以下代碼。 注意:此步驟比較耗時,請耐心等待計算完成。

queryFlightNumResult.take(1)n

在此基礎上我們可以細化一下,計算出每天的平均離港航班數量,並且每次只選擇 1 個月的數據。這裡我們選擇的時間段為 10:00 至 14:00 。

請在 Spark Shell 中輸入以下代碼。

// COUNT(DISTINCT DayofMonth)的作用是計算每個月的天數nval queryFlightNumResult1 = sqlContext.sql("SELECT COUNT(FlightNum)/COUNT(DISTINCT DayofMonth) FROM flights WHERE Month = 1 AND DepTime BETWEEN 1001 AND 1400")n

查詢得到的結果只有一條,即該月每天的平均離港航班數量。查看一下:

請在 Spark Shell 中輸入以下代碼。 注意:此步驟比較耗時,請耐心等待計算完成。

queryFlightNumResult1.take(1)n

你可以嘗試計算出其他時間段的平均離港航班數量,並作記錄。你的結論是否與下方的結論相同呢?

最終統計的結果表明:1998年1月,每天最繁忙的時段為下午。該時段的平均離港航班數量為4356.7個。

其他問題詳解可以在實驗樓中查看並在線完成:

Spark - 大數據帶你看穿航班晚點的套路

3.2 飛哪最準時

3.3 出發延誤的重災區都有哪些

3.4 航班延誤時間預測

3.5 數據可視化設計

更多經典的編程練手項目:全部課程 - 實驗樓

大數據學習路徑:大數據工程師-學習路徑

微信關注公眾號[實驗樓],手機查看海量項目教程。


推薦閱讀:

編譯原理和演算法導論是不是屠龍技 有技而無龍可屠?
上海交通大學 ACM 的 Dreadnought 隊伍怎麼這麼強?
會好幾門編程語言,對做好產品經理有什麼作用?
在python的socket編程中,如果使用socket.recv()接收數據,到下次接收的時候又是上次沒接收完的信息,我怎麼才可以再次重新接收數據?

TAG:大数据 | Spark | 编程 |