大數據帶你挖掘打車的秘籍

項目簡介:計程車是我們生活中經常乘坐的一種交通工具,但打車難的問題也限制了我們更好地利用這種交通方式。在哪些地方計程車更容易打到?在什麼時候更容易打到計程車?本課程將基於某市的計程車行駛軌跡數據,帶你學習如何應用Spark SQL和機器學習相關技巧,並且通過數據可視化手段展現分析結果。

本項目完整教程及在線練習地址:大數據帶你挖掘打車的秘籍 - 實驗樓(更多大數據項目請查看大數據工程師 - 學習路徑)

一、實驗簡介

本次實驗將通過對成都某天的計程車數據進行處理,分析當天哪個時段的計程車最繁忙、哪個區域的計程車最繁忙兩個問題,並將分析結果可視化。

圖片來自pixabay.com

1.1 知識點

  • Spark DataFrame操作
  • Spark SQL 的 API 查詢
  • Spark MLlib 的 KMeans 演算法應用

1.2 準備工作

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

  • Spark大數據動手實驗
  • Spark DataFrame入門
  • Spark DataFrame詳解
  • Spark 講堂之 SQL 入門

二、數據集簡介及準備

圖片來自pixabay.com

2.1 數據集簡介

本數據集為四川省成都市的計程車GPS記錄數據集。該數據集已提前清洗完成,僅提取了原始數據集中某一天的部分數據,並且去除了時間段在 0 點至 6 點之間的較少數據。

數據記錄了成都市部分計程車在載客時的GPS位置和時間等信息,數據記錄的格式為 CSV 格式。

已清洗的數據僅供本課程學習使用,有一定的模擬性質。如需要更多的信息,則需要從原始數據按照相應的目的進行清洗。

該數據集中的一條記錄如下所示:

1,30.624806,104.136604,211846n

對各個欄位逐個解釋如下:

  • TID:計程車的ID。每輛計程車的TID都是唯一的。
  • Lat:計程車狀態為載客時的緯度。
  • Lon:計程車狀態為載客時的經度。
  • Time:該條記錄的時間戳。如 211846 代表 21 點 18 分 46 秒。

CSV 格式是數據分析工作中常見的一種數據格式。CSV 意為逗號分隔值(Comma-Separated Values),其文件以純文本形式存儲表格數據(數字和文本)。每行只有一條記錄,每條記錄被逗號分隔符分隔為欄位,並且每條記錄都有同樣的欄位序列。

CSV 格式能被大多數應用程序所支持,廣泛用於在不同的系統之間轉移數據,是一種容易被兼容的格式。實驗樓中大量的數據分析類課程都使用了 CSV 格式的數據集,不僅如此,我們也推薦你在今後的數據分析工作中應用此格式來存儲數據。

2.2 下載數據集

雙擊打開桌面上的 Xfce 終端,然後輸入下面的命令以下載航班數據集:

wget http://labfile.oss.aliyuncs.com/courses/736/taxi.csvn

下載得到的 CSV 數據文件位於你使用解壓命令時的工作目錄中,默認情況是在 /home/shiyanlou 目錄中。

2.3 啟動 Spark Shell

為了更好地處理 CSV 格式的數據集,我們可以直接使用由 DataBricks 公司提供的第三方 Spark CSV 解析庫來讀取。

首先是啟動 Spark Shell。在啟動的同時,附上參數--packages com.databricks:spark-csv_2.11:1.1.0

請在終端中輸入以下代碼。

spark-shell --packages com.databricks:spark-csv_2.11:1.1.0n

2.4 導入數據

2.4.1 載入實驗所需的包

首先我們需要載入本節實驗所需要的包。這些包主要有:

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

import org.apache.spark._nimport org.apache.spark.sql._nimport org.apache.spark.sql.types._nimport org.apache.spark.sql.functions._nimport org.apache.spark.ml.feature.VectorAssemblernimport org.apache.spark.ml.clustering.KMeansn

2.4.2 定義欄位格式

在實驗樓為你提供的大多數的數據分析類課程中,用到的 CSV 格式的數據集都在首行標記了各個欄位的名稱。但本課程中用到的數據集卻沒有這個關鍵信息,如果我們直接創建 DataFrame 的話,就不能夠很好地去定位到各個列。因此在導入數據之前,我們需要先定義數據的欄位格式(Schema)。

在學習 Spark SQL 時,我們已經知道: Spark SQL 支持兩種不同的方式來將現有的 RDD 轉換為數據框(DataFrame)。第一個方法是使用反射機制(Relection),另一個則是通過編程的方式指明欄位格式。

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

// 利用 StructType 定義欄位格式,與數據集中各個欄位一一映射。n// StructField 中的的三個參數分別為欄位名稱、欄位數據類型和是否不允許為空。nval fieldSchema = StructType(Array(n StructField("TID", StringType, true),n StructField("Lat", DoubleType, true),n StructField("Lon", DoubleType, true),n StructField("Time", StringType, true)n))n

2.4.3 讀取數據

定義好欄位格式之後,調用了 sqlContext 提供的 read 介面,指定載入格式 format 為第三方庫中定義的格式 com.databricks.spark.csv 。因為本次課程使用的數據集中首行沒有各列的欄位名稱,因此需要設置讀取選項 header 為 false。最後,在 load 方法中 指明待讀取的數據集文件的路徑。

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

val taxiDF = sqlContext.read.format("com.databricks.spark.csv").option("header", "false").schema(fieldSchema).load("/home/shiyanlou/taxi.csv")n

可以看到讀取後的數據已經映射到各個定義好的欄位中了。

2.4.4 檢查已導入的數據

讀取數據之後,通常會使用 printSchema() 方法列印出 DataFrame 的欄位格式。

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

taxiDF.printSchema()n

然後使用 show() 方法列印出前 20 條記錄,查看數據是否正常。

taxiDF.show()n

後續章節可在實驗樓中查看並在線完成:

Spark - 大數據帶你挖掘打車的秘籍

三、對計程車數據進行聚類

3.1 K-Means 聚類演算法簡介

3.2 Spark 框架中的 K-Means 演算法實現

3.3 定義特徵數組

3.4 進行 K-Means 計算

3.5 對測試集進行聚類

3.6 分析聚類的預測結果

3.6.1 每天哪個時段的計程車最繁忙?

3.6.2 每天哪個區域的計程車最繁忙?

四、數據分析進階,數據結果可視化

本項目教程,未經授權,禁止轉載。

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

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

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


推薦閱讀:

活動回顧 & 預告 | 25Meetings- 數據的海洋心懷天下
Facebook 前產品總監: 我不招只想當 CEO 的產品經理丨數據工匠簡報(8.01)
DMP核心流程-樣本訓練【技術類】
【乾貨】教你手把手的製作詞雲圖

TAG:大数据 | Spark | 编程 |