大数据案例之OD线分析
生活随笔
收集整理的這篇文章主要介紹了
大数据案例之OD线分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 我們從網絡上爬取了2013年到2017年芝加哥每一輛出租車的每一單行程數據,數據內容示例如圖一,包含了出租車ID,行程ID,上下車時間,上下車坐標,行程耗時,費用以及支付方式等信息。有了這些數據,我們就可以對其進行數據挖掘分析,找到打車需求最旺的區域和時間段,以便得到更好的出租車資源調度策略等。本案例中我們明確分析目標,要找出2016年里周末10點到18點這個時間段,從奧黑爾國際機場出發的旅客都去了哪兒。深入分析也能從這個分析目標中預測出芝加哥最熱門的旅游景點等。
? 針對該分析目標,我們選擇supermap pyspark大數據組件產品,其OD線分析功能即可實現該分析目標,由于OD線分析需要行政區域面數據集,故我們又爬取了芝加哥主要的行政區域面數據。
-
數據
-
工具
supermap-bdtpy-9.1.0-beta
-
步驟
-
數據上傳到hdfs,便于分布式計算
./hadoop fs -put /opt/data/*.csv /opt/data/*.meta /taxi_data -
讀取出租車數據,并按條件過濾,提取2016年周末10-18點期間在奧黑爾國際機場上車的行程單
def get_point():fRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-Taxi_Trips.csv', SpecFieldNames('', 'TripStartTimestamp', ''), 36, None,'hdfs://localhost:9000/taxi_data/Chicago-Taxi_Trips.meta', None)regionRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-region.csv', SpecFieldNames('SmID', '', ''), 36, None,'hdfs://localhost:9000/taxi_data/Chicago-region.meta', None)# 奧黑爾國際機場所在的行政區ID為165381airportRdd = regionRdd.filter(lambda f: int(f.get_value('OBJECTID')) == 165381)# 構造時間周期,2016年里所有的周末,2016-01-02為第一個周六cycleW = TimeCycle(Duration(1, DurationUnit.Weeks), '2016-01-02 00:00:00', Duration(2, DurationUnit.Days),'2016-01-01 00:00:00', '2017-01-01 00:00:00')tfW = TimeCycleFilter(cycleW)# 構造時間周期,每天的10-18點cycleH = TimeCycle(Duration(1, DurationUnit.Days), '2016-01-02 10:00:00', Duration(8, DurationUnit.Hours),'2016-01-01 00:00:00', '2017-01-01 00:00:00')tfH = TimeCycleFilter(cycleH)# 上車點數據按時間過濾,過濾行程終點為空的,過濾行程時間異常的,按區域裁剪fr = fRdd.filter(tfW).filter(tfH).filter(lambda f: f.get_value('TripSeconds') != None).filter(lambda f: f.get_value('DropoffCentroidLatitude') != None).filter(lambda f: f.get_value('DropoffCentroidLongitude') != None).filter(lambda f:int(f.get_value('TripSeconds')) > 120).filter(lambda f:int(f.get_value('TripSeconds')) < 12000).clip(airportRdd.first())return fr -
點數據集轉屬性表數據集,od線分析需要上車點與下車點的關系表數據集
# 構造屬性表結構 def make_new_meta():struct_type = StructType()struct_type.add(StructField('TripID', StringType()))struct_type.add(StructField('TaxiID', StringType()))struct_type.add(StructField('TripSeconds', IntegerType()))struct_type.add(StructField('DropoffCentroidLat', DoubleType()))struct_type.add(StructField('DropoffCentroidLon', DoubleType()))struct_type.add(StructField('PickupCentroidLat', DoubleType()))struct_type.add(StructField('PickupCentroidLon', DoubleType()))return FeatureMetadata(struct_type, 'Empty', None, has_feature_id=True)# 構造新的要素 def make_new_feature(f):xy = str(f.get_value('PickupCentroidLocation'))import re# 提取起始點的xy坐標x, y = re.findall(r'[(](.*?)[)]', xy)[0].split(" ")field_value = [f.get_value('TripID'), f.get_value('TaxiID'), f.get_value('TripSeconds'), f.get_value('DropoffCentroidLatitude'), f.get_value('DropoffCentroidLongitude'), y, x]# none代表屬性表記錄,注意參數順序return Feature(None, field_value, id_value=f.get_value('TripID'), field_infos=make_new_meta()._get_field_infos())# 點轉屬性表 def get_table():rdd = get_point().rdd.map(lambda f: make_new_feature(f))tableRdd = FeatureRDD.make(rdd, make_new_meta())return tableRdd -
讀取用于OD線分析的行政區域面數據
# 用于od線制作的面數據 def get_region():regionRdd = read_csv(ss.sparkContext, 'hdfs://localhost:9000/taxi_data/Chicago-region.csv',SpecFieldNames('OBJECTID', '', ''), 36, None, 'hdfs://localhost:9000/taxi_data/Chicago-region.meta', None)return regionRdd -
構建OD線
def make_odline():# 參與計算的featurerdd必須具備唯一id值odRdd = make_od_line(get_region(), get_table(), 'NAME', 'PickupCentroidLon', 'PickupCentroidLat', 'DropoffCentroidLon', 'DropoffCentroidLat', 'TripSeconds,Sum,sumTripSeconds')# od線數據odRdd[0].save_as_csv('hdfs://localhost:9000/taxi_data/output/workday16_line.csv', write_header=True)#od關聯區域面數據odRdd[1].save_as_csv('hdfs://localhost:9000/taxi_data/output/workday16_region.csv', write_header=True)print('Done') -
結果展示,通過idesktop對od分析結果數據集制作專題圖表達,可以看出去市區的人最多。
-
感興趣的伙伴可以進行更多的深度分析,比如不同時間段哪個區域的用車量最大?哪個區域更容易接到長途出租車單?
-
源碼及數據下載鏈接
總結
以上是生活随笔為你收集整理的大数据案例之OD线分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DPDK 18 log日志系统使用
- 下一篇: Kaggle入门篇