實驗
github倉庫:
https://github.com/zx4321/BigDataVisualization
https://github.com/zx4321/BigDataSpark
1. 問題描述
題号:(選修)15号
題目名稱:紐約市計程車乘客的出行特征
複制你的問題描述:資料集:http://chriswhong.com/open-data/foil_nyc_taxi/為2013年紐約市計程車出行記錄,請你基于spark平台,分析一下乘客的出行特征。
介紹你要解決的問題
- 問題的背景/意義
這是紐約市2013年計程車的出行資料。通過資料分析,可以得到計程車出行的路程分布、路程長度、上車中心點等。比如獲得上車的中心點,就可以判斷計程車在這附近能夠最大可能載客。
- 問題的技術難點
對大資料架構的熟悉,大資料可視化,大資料海量資料處理。
2. 基于的系統/算法
介紹你使用的主要的系統或者算法庫
- 系統架構/算法原理
軟體開發系統:
- Intellij專業版
- Spark4.0
- JDK8.0
- scala2.11.12
- hadoop-2.7.7
- Tomcat9.0
- Echart4.0
算法原理:
- Kmean算法:
b. 你為什麼選擇使用這個系統/算法
Spark2.4.0 、scala2.11.12 、hadoop-2.7.7這是一個典型的大資料處理架構,能夠快速的對大批量的大資料進行分析。
Tomcat9 、 Echart4.0 主要是用于java web程式可視化,其中Echart4.0能夠對千萬級的資料進行網頁渲染。
Kmean算法能夠獲得一批資料的中心點,可以得到某個地區的上車中心點,那麼計程車在中心點資料能夠最大可能獲得乘客。
- 你是如何使用這個系統/算法的
首先使用spark進行大資料的處理,得到自己想得到的資料,并儲存為對應格式的檔案,然後使用java web程式對檔案進行展示分析。
(誤區:之前認為大資料可視化,就應該使用spark對應的可視化工具,比如Apache Zepplin 、 Spark Notebook , 我認為在這個實驗上面是一個誤區,導緻我花費一兩天時間查這兩個架構(也有可能我菜,不會用),但是采用這兩個架構也能成功,但是我覺得費時費力,還不如采用web技術的架構,比如Echart4等。我目前采用的方案是,Spark分析資料,得到自己想要的資料,儲存為檔案(也可以是資料庫檔案),然後采用java web 程式進行結果展示, java程式需要另外編寫,不應該在spark架構下寫)
3. 實驗流程
詳細介紹你完成實驗的主要流程
3.1 資料格式分析
實驗資料壓縮包(tripData2013.zip):11GB
實驗資料儲存目錄:
實驗資料儲存格式(CSV):
3.2 spark代碼編寫和運作結果
3.2.1 初始化spark
3.2.2 讀取檔案(小技巧:設定大小不一樣的檔案,友善測試檔案,資料為一月份資料)
3.2.3 删除第一行,并将資料集緩存
3.2.4 統計資料行數
運作結果:
3.2.5 統計每次乘車的乘客數量,并儲存為txt檔案
說明:通過生成一個新的RDD(passengerCountRDD),格式為(乘客數量:1),比如(1人:1);采用了reduceByKey這個算子,統計所有的資料,得到結果,比如(1人:1萬次)。然後儲存資料為TXT檔案,用于後期java web程式可視化。
儲存資料為:
3.2.6 計算每次乘車的乘客平均數量
說明: 通過3.2.5處理的得到資料passengerCount,通過 乘客數量* 乘以乘客乘車次數 得到所有的乘客數量,然後除以資料總數(dataLength)得到平均每次乘車的乘客數量。
運作結果:
3.27 擷取某月中每天的打車的人數
說明: 通過SimpleDateFormat函數,格式化時間(例如:2013/1/1 15:11:48),再通過formatter.parse(“2013/1/1 15:11:48”).getDate 擷取這是幾号,得到RDD資料,格式為(1号,一次),最後通過reduceByKey算子,得到所有的資料,例如(1号, 一萬次),代表在2013年1月1号這天有一萬個人打車。最後儲存為TXT檔案。
運作結果:
3.2.8 擷取一天中各個時間段打車的人數
運作結果:
3.2.9 擷取乘車的平均時間
運作結果:
3.2.10 擷取乘車的時間的分布(每100S)
運作結果:(0S 代表計程車載客運作時間小于50S)
3.2.11 擷取乘車的距離的分布(每1KM)
運作結果:
3.2.12 Kmean 聚類分析載客中心點
将地圖坐标資料儲存為單獨的檔案,用于可視化分析
調用Kmean函數,訓練資料的中心點
運作結果:
3.3 可視化及其乘客的出行特征分析
Echart官網:http://www.echartsjs.com/index.html
Github:引用了https://github.com/lihaogm/spark-echarts-log的java web程式
3.3.1 完成每個HttpServlet的編寫
3.3.2 配置<web-app>
3.3.3 每次乘車時間長度可視化
分析:可以看出乘客乘車時間最多在400S 左右,其中50S以下的也有78817次,最長的時間也有10800S。
3.3.4 每次乘車距離可視化
分析:乘客乘車距離大多在1KM左右,500M以下的也有667477次,最長的有100KM.
3.3.5 每天各個時間段乘車資料可視化
分析:可以看出淩晨5點鐘打車的人最少,晚上18-19點鐘打車的人最多。
3.3.6 每月每天乘車資料可視化
分析:可以看出乘客的乘車的資料呈現周期性變化。
3.3.7 每次乘車乘客資料可視化
分析:乘客大多數在一人,最多的有9人
3.3.8 上車地點可視化(千萬級資料渲染)
分析:通過大資料渲染,可以清晰的看到乘客乘車的中心點。
4. 實驗過程分析
測試你設計實作的系統/算法的效果
- 測試環境:CPU、記憶體、磁盤、網絡(如有)、GPU(如有)
CPU:I5-7th
記憶體:8G
磁盤:機械1T
- 資料集:資料集的來源(是自己生成的還是下載下傳的,生成程式是如何編寫的,下載下傳的資料是選取了一部分還是全部使用了)、資料檔案或資料庫占用磁盤空間大小、包含的記錄個數(行數)、包含的屬性及其意義
通過http://chriswhong.com/open-data/foil_nyc_taxi/資料集下載下傳得到的資料,一共11G
- 測試算法/系統的效果,如誤差大小,準确率等随參數的變化情況,用圖表展示并作較長的描述
Kmean 随着疊代的次數正确率而上升。
5. 結論
通過這次大資料實驗,我學會了spark+scala的基本使用,同時了解大資料可視化的困難。也了解了大資料可視化的特點,同時明白了大資料的重要性,和可視化對資料分析的重要性。也寫了web程式在可視化中的重要特點。