• 大数据基础---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。

    项目开源地址

    系列传送门

  • 相关阅读:
    内联函数和宏
    C++内联函数与宏定义
    C++函数声明和定义深度解析
    C++中的头文件和源文件
    国外程序员整理的 C++ 资源大全
    c语言中的字符数组与字符串
    iOS应用架构谈(二):View层的组织和调用方案(中)
    iOS应用架构谈(一):架构设计的方法论
    解决xib约束冲突
    tableView设置首尾
  • 原文地址:https://www.cnblogs.com/shun7man/p/12852067.html
Copyright © 2020-2023  润新知