实时即未来,大数据项目车联网之车辆驾驶行程分析(13)

236 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

车辆驾驶行程分析

驾驶行程分析业务逻辑

星途车联网项目大数据平台,包含

数据源

数据存储pipeline

实时业务指标统计分析

数据存储分层

数据可视化

我们已经学习了原始数据实时ETL部分,数据存储在hive和hbase中,这部分数据对应hive数仓分层中的ODS层,本章内容围绕驾驶行程主题分析展开。

1 车联网项目数据存储分层设计

ODS层数据来源于车辆上报原始json实时ETL后的数据,DW(DWD)数据存储指标明细数据与维度分析拉宽表数据,来源于车联网业务主题分析结果数据。DM(APP)层来源于DW层转换数据,或ODS层数据通过分析直接得出DM层数据。

l ODS:原始数据层

l DW(DWD):数据仓库层(数据表明细层,由DW层拆分出来)

  • 主题业务结果数据,针对主题业务结果的宽表数据或主题业务结构明细数据

l DM(APP):数据集市层(可用于可视化指标存储层)

image-20221018195112154

2 车辆驾驶行程定义

1 驾驶行程业务简介

车辆在一定时间内行驶的里程称为行程,车辆行程由载重行程和空车行程构成。

  • 例子:隔壁老王周五准备下班时,开始下雨,于是准备开车去接女友到餐馆吃饭,刚刚行驶五分钟,老王的基友老郝打电话给他,老王把车停在安全的地方,接老郝的电话,老郝告诉老王到他们公司附近的咖啡店坐一坐,共商“赚钱大计”(日常互吹),老王于是继续开车到老郝公司附近的咖啡店,半个小时,又从咖啡馆开车到女朋友的公司,短暂停顿后,开车去餐馆吃饭,去了一个餐馆,发现需要等很久,等了十分钟后,不愿意继续等,他们驾车去另外一个餐馆吃饭,吃完饭,然后开车回家。

u 问题:此例子中,有多少个驾驶行程?

通常认为,行程指用户在一定时间内,连续的、不间断的驾驶车辆进行移动行为。根据停车时间超过15分钟划分行程。

  • 原因:行程划分分别按照5min、10min、15min、20min对数据进行行程划分,得到A、B、C、D类数据,通过F检验判断各个数据是否有显著性差异,即比较数据中各个变量的方差是否有显著性差异;通过t检验验证各个变量的均值是否相等。通过F检验和t检验验证发现按照15min划分行程,与其他时间划分的行程数据存在显著性差异,故按照15min来划分行程。
  • 时间上,对行程划分时间的选择,是通过统计概率进行计算出来

n T检验与F检验:

u T检验:

爱尔兰都柏林有一家健力士公司,该公司员工 威廉·希利·戈斯特 提出了t检验以降低啤酒质量监控成本,但健力士公司为保护公司利益,不允许员工发布此类文章。戈斯特并没有放弃对t检验的研究,并以”The Student”为笔名,发表关于t检验的文章,所以t检验又称为“学生t检验”

l t检验在啤酒厂的应用,啤酒的主要原料是大麦,如要提高啤酒产量,必须提高大麦的亩产量,下图中左边的麦田是用传统工艺(每珠大麦100粒穗子),右边的麦田使用改良工艺(5珠大麦,平均每珠120粒穗子),直观看,产量提示20%。

  • 戈斯特提出一个假设检验

u 假设:改良工艺没有提高产量

u 检验:在此假设下,x = 120发生的概率

img

l T检验是为了检验根据样本判断是否满足假设条件的统计学方法之一

u F检验

主要包含方差齐性检验(F-test of equality of variances)、方差分析(Analysis of Variance, ANOVA)、线性回归方程整体的显著性检验。

l F检验对于数据的正态性非常敏感,因此在检验方差齐性的时候,Levene检验, Bartlett检验或者Brown–Forsythe检验的稳健性都要优于F检验,若两个母体有相同的方差(方差齐性),那么可以采用F检验,但是该检验会呈现极端的非稳健性和非常态性, 可以用t检验、巴特勒特检验等取代。

u 讲义关联资料\统计概率中的T检验和F检验.md

2 驾驶行程分析流程

原始数据->kafka->flink实时处理(etl、业务逻辑解析)->驾驶行程与驾驶行程采样数据入库

image-20221018195235338

关联性业务:充电驾驶行程分析

image-20221018195301616

3 驾驶行程分析业务价值

单次行驶里程区间分布、单次行程消耗soc区间分布、最大里程分布、充电行程占比、平均行驶里程分布、周行驶里程分布、最大行驶里程分段统计、常用行驶里程、全国-每日平均行驶里程(近4周)、全国-单车日均行驶里程分布(近一年)、各车系单次最大行驶里程分布、不同里程范围内车辆占比情况

img

2. 驾驶行程分析任务设置

2.1 驾驶行程分析任务基类和主类设置

创建驾驶行程划分任务:TripDriveTask

img

继承自BaseTask基类

/**
 * 驾驶行程业务开发
 * 1)消费kafka数据过滤出来驾驶行程采样数据,实时的写入到hbase表中
 * 2)消费kafka数据过滤出来驾驶行程数据,实时的写入到hbase表中
 */
public class TripDriveTask extends BaseTask {
}

创建flink流式任务环境

/**
 * 驾驶行程业务开发
 * 1)消费kafka数据过滤出来驾驶行程采样数据,实时的写入到hbase表中
 * 2)消费kafka数据过滤出来驾驶行程数据,实时的写入到hbase表中
 */
public class TripDriveTask extends BaseTask {
    public static void main(String[] args) {
        //TODO 1)初始化flink流式处理的开发环境
        StreamExecutionEnvironment env = getEnv(TripDriveTask.class.getSimpleName());
​
        try {
            env.execute("TripDriveTask");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
} 

l kafka数据源设置

/**
 * 驾驶行程业务开发
 * 1)消费kafka数据过滤出来驾驶行程采样数据,实时的写入到hbase表中
 * 2)消费kafka数据过滤出来驾驶行程数据,实时的写入到hbase表中
 */
public class TripDriveTask extends BaseTask {
    public static void main(String[] args) throws Exception {
        //TODO 1)初始化flink流式处理的开发环境
        StreamExecutionEnvironment env = getEnv(TripDriveTask.class.getSimpleName());
​
        //TODO 6)将kafka消费者对象添加到环境中
        DataStream<String> dataStreamSource = createKafkaStream(SimpleStringSchema.class);
​
        try {
            env.execute("TripDriveTask");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

数据预处理

n json数据解析、转换

  • 过滤解析成功的数据
  • 过滤驾驶行程数据

u 充电状态为行车充电(chargeStatus=2)、未充电(=3)的数据为驾驶行程数据

u 否则充电状态为停车充电(=1)、充电完成(=4)则为驾驶充电行程数据

/**
 * 驾驶行程业务开发
 * 1)消费kafka数据过滤出来驾驶行程采样数据,实时的写入到hbase表中
 * 2)消费kafka数据过滤出来驾驶行程数据,实时的写入到hbase表中
 */
public class TripDriveTask extends BaseTask {
    public static void main(String[] args) throws Exception {
        //TODO 1)初始化flink流式处理的开发环境
        StreamExecutionEnvironment env = getEnv(TripDriveTask.class.getSimpleName());
​
        //TODO 6)将kafka消费者对象添加到环境中
        DataStream<String> dataStreamSource = createKafkaStream(SimpleStringSchema.class);
​
        //TODO 7)将消费出来的数据进行json解析成javaBean对象
        SingleOutputStreamOperator<ItcastDataObj> itcastJsonStream = dataStreamSource.map(JsonParseUtil::parseJsonToObject)
                //过滤出来驾驶行程数据
                .filter(itcastDataObj -> 2 == itcastDataObj.getChargeStatus() || 3 == itcastDataObj.getChargeStatus());
​
        try {
            env.execute("TripDriveTask");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

创建行程划分Window(第四节实现)

  • 添加行程划分水位线
  • 根据vin进行分组
  • 指定Window为SessionWindow

驾驶行程采样分析与入库(第四节实现)

驾驶行程划分与入库(第五节实现)