大数据基础---Spark车辆监控项目

一、项目简介

这是一个车辆监控项目。主要实现了三个功能:

1.计算每一个区域车流量最多的前3条道路。

2.计算道路转换率

3.实时统计道路拥堵情况(当前时间,卡口编号,车辆总数,速度总数,平均速度)

二、项目结构

├─TrafficBySparkAndKafka
├─data
└─src
├─main
│ ├─java
│ │ └─vip
│ │ ├─producedate2hive(模拟数据到文件和Hive)
│ │ ├─shuai7boy
│ │ │ └─trafficTemp
│ │ │ ├─areaRoadFlow(每个区域top3道路速度统计。道路转换率。)
│ │ │ ├─conf (获取配置文件帮助类)
│ │ │ ├─constant (接口静态类,防止硬编码)
│ │ │ ├─dao
│ │ │ │ ├─factory (工厂类)
│ │ │ │ └─impl (接口实现类)
│ │ │ ├─domain (属性定义类)
│ │ │ ├─jdbc (jdbc帮助类)
│ │ │ ├─rtmroad(实时统计道路拥堵情况)
│ │ │ ├─skynet
│ │ │ └─util (帮助类)
│ │ └─spark
│ │ └─spark
│ │ └─test (模拟实时数据)
│ ├─resources
│ └─scala
│ └─top
│ └─shuai7boy
│ └─trafficTemp
│ └─areaRoadFlow (利用scala和java互调用,实现top3道路速度统计)

└─test
└─java

三、数据源

数据源类型:

monitor_flow_action(每个摄像头的监控数据)

当天日期 卡口编号 摄像头编号 车牌号 拍摄时间 车速 道路编号 区域编号

2020-05-08  0001   34287  京M80025    2020-05-08 05:35:58    57 25 03
2020-05-08 0005   99132  京M80025    2020-05-08 05:51:28    149    50 04

monitor_camera_info(卡口和摄像头对应编号)

0006    00443
0006   25745
0006   98681
0006   36400

存储介质:

如果在本地运行的话,这里读取的是本地文件。

如果在集群运行,对于批处理读取的是Hive,对于流处理这里读取Kafka。

四、数据转换流程

1.计算每一个区域车流量最多的前3条道路。

  • 从表traffic.monitor_flow_action根据日期获取车流量监控日志信息。

    挡在集群中时,traffic.monitor_flow_action代表的是hive中的表,当在本地运行时,traffic.monitor_flow_action是本地创建的临时表。

  • 从area_info表中获取区域信息。

    area_info是MySql中的表。

  • 根据步骤二获取的区域信息,补全监控日志名称。根据join,map即可拼接一个新的RDD,并将RDD转换为DataFrame的临时表tmp_car_flow_basic。

  • 统计各个区域的道路车流量。

    使用Spark SQL根据区域名称,道路ID进行分组。即可统计出每个区域,每条道路对应的车流量。

  • 统计每个区域top3车流量。

    利用开窗函数进行统计。row_number() over(partition by area_name order by road_id desc)

用到的技术:Hive,Spark SQL,临时表,MySql,JDBC,join,map,RDD转换DataFrame。

2.计算道路转换率

  • 从MySql拿出我们要对比的转换路段

  • 从日志拿出指定日期的监控数据

  • 将监控数据转换为键值对(car,row)格式

  • 计算每个路段的匹配情况。

    逻辑:将第三步拿到的数据,根据car进行分组,映射键值对。将轨迹信息根据时间进行排序,然后拼接。

    将我们指定的路段(第一步获取到的)和上面拼接的数据进行比对,得出匹配情况。(路段,匹配次数)

  • 因为上面求的是多辆车的 (路段,匹配次数)。这步使用reduceByKey进行聚合,将相同路段进行汇总。

  • 获取转化率。

    转换率=(这次路段的匹配度)/(上次路段的匹配度)即可得到。、

    这次路段的匹配度=(聚合数据.get(路段))

用到的技术:mapToPair,groupByKey,flatMapToPair(进来一辆车,出去多个对应路段信息),reduceByKey。

3.实时统计道路拥堵情况(根据车辆和车速判断)

  • 根据日志获取(卡口ID,汽车速度)格式数据
  • 获取(卡口ID,(汽车速度,1))格式数据,后面的1代表车辆数
  • 获取(卡口ID,(汽车总速度,总车辆数))
  • 打印车辆(卡口,总速度,总车辆,平均速度)

用到的技术:map,mapToPair,mapValues(仅仅针对value进行map,(key,(value,1))格式数据),reduceByKeyAndWindow。

项目开源地址

系列传送门

posted @ 2020-05-08 17:54  数据驱动  阅读(1018)  评论(0编辑  收藏  举报