大數據帶你挖掘打車的秘籍
本項目完整教程及在線練習地址:大數據帶你挖掘打車的秘籍 - 實驗樓(更多大數據項目請查看大數據工程師 - 學習路徑)
一、實驗簡介
本次實驗將通過對成都某天的計程車數據進行處理,分析當天哪個時段的計程車最繁忙、哪個區域的計程車最繁忙兩個問題,並將分析結果可視化。
圖片來自http://pixabay.com
1.1 知識點
- Spark DataFrame操作
- Spark SQL 的 API 查詢
- Spark MLlib 的 KMeans 演算法應用
1.2 準備工作
本課程需要你具有一定的Spark基礎,以下為推薦在本課程之前需要學習的課程(已按先後順序進行排列):
- Spark大數據動手實驗
- Spark DataFrame入門
- Spark DataFrame詳解
- Spark 講堂之 SQL 入門
二、數據集簡介及準備
圖片來自http://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核心流程-樣本訓練【技術類】
※【乾貨】教你手把手的製作詞雲圖