设备型号活跃分析 (重构版 V2)
本文档详细介绍了设备型号活跃分析工具(V2)的架构、数据流转及执行方法。该工具用于分析海量设备日志,计算设备活跃、留存、流失及复活等关键指标。
1. 简介
重构后的分析工具位于 cn.akrdinfo.util.device.deviceactivity_v2 包下,旨在提供更清晰的模块划分、更高效的内存管理(基于Hash分片和日期压缩)以及分步执行的能力。
核心功能
- 数据预处理:从 SQL DDL 提取基础数据,将分散的日/月度CSV文件合并,并进行MAC Hash分片和日期压缩。
- 模型分析:按设备型号维度,计算活跃、中断(留存)、复活等指标。
- 通用分析:进行整体分析(全部/巴伦/非巴伦),不按型号分组。
- 结果排序:对分析结果按活跃量和日期进行排序。
- 报表生成:将结果导入数据库,并生成稳定性分析报告。
2. 系统架构
工具采用了分层架构,各模块职责单一,可独立运行。
3. 数据流转
数据处理流程分为七个主要阶段,每个阶段都有明确的输入和输出。
关键技术点
-
MAC Hash 分片 为了防止一次性加载过大数据导致 OOM,在合并数据时,工具根据
mac.hashCode() % batchCount将数据分为多个批次处理。每次只将属于当前批次的数据加载到内存中进行聚合。 -
日期压缩 (DateCustomMap) 在内存处理过程中,将
yyyyMMdd格式的日期转换为 Base62 编码的短字符串(如 "A", "B", "1z"),极大地减少了Set<String>的内存占用。写入文件时会自动解码回原始日期。
4. 详细执行指南
入口类:cn.akrdinfo.util.device.deviceactivity_v2.DeviceActivityAnalysisApp
步骤 1: 基础数据准备
功能: 从 SQL DDL 导出文件和巴伦芯片名单中提取设备基础信息,生成标准化的 CSV 文件。
- 方法:
prepareBaseData() - 输入文件:
base_device_data_ddl.sql(数据库备份,含INSERT INTO语句)balun-mac.txt(巴伦芯片 MAC 地址列表,每行一个 MAC)
- 输出文件:
base_device.csv- 表头:
mac,cpu,设备型号,是否巴伦 - 字段含义:
字段名 含义 macMAC 地址 cpu芯片型号 (如 HI3798MV300)设备型号设备的具体型号名称 (如 EC6108V9)是否巴伦标识该设备是否使用巴伦芯片 ( 是/否)
- 表头:
步骤 2: 天级转月度 (可选)
功能: 将原始的天级活跃日志聚合为月度活跃数据,并在此过程中直接关联设备型号和巴伦属性。
- 方法:
convertDailyToMonthly() - 输入文件:
device_activity_detail_YYYYMM.csv(天级明细)- 表头:
mac,cpu,recordTime
- 表头:
base_device.csv(由步骤 1 生成)- 表头:
mac,cpu,设备型号,是否巴伦
- 表头:
- 输出文件:
month_result_YYYYMM.csv- 表头:
mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合 - 字段含义:
字段名 含义 macMAC 地址 cpu芯片型号 设备型号设备型号 活跃天数该月内的总活跃天数 是否巴伦是否巴伦芯片 ( 是/否)活跃日期集合该月内所有活跃日期的拼接 (如 `20260101
- 表头:
步骤 3: 数据合并
功能: 将分散的多个月度结果文件合并为一个总表,同时进行 MAC 去重和日期合并。
- 方法:
mergeMonthlyData() - 输入文件:
- 多个
month_result_*.csv文件- 表头:
mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合
- 表头:
- 多个
- 输出文件:
monthMerge.csv- 表头:
mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合 - 字段含义:
字段名 含义 macMAC 地址 cpu芯片型号 设备型号设备型号 活跃天数统计周期内的总活跃天数 是否巴伦是否巴伦芯片 ( 是/否)活跃日期集合所有活跃日期集合,使用 `
- 表头:
步骤 4: 模型分析
功能: 基于合并后的总表,按设备型号分组,计算每日的活跃、新增、流失、中断和复活数据。
- 方法:
analyzeByModel() - 输入文件:
monthMerge.csv- 表头:
mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合
- 表头:
- 输出文件: (生成在
config.baseDir/deviceModel/{timestamp}/目录下)设备型号活跃变化(详细).xlsx设备型号活跃变化(详细_全部).csv设备型号活跃变化(详细_仅巴伦).csv设备型号活跃变化(详细_非巴伦).csv
- 表头及含义:
字段名 含义 基准日期统计的参考日期 (yyyyMMdd) 设备型号聚合维度 设备数量该型号在基准日期的活跃总数 今日新增活跃在基准日期首次出现的设备数 今日后不再活跃设备数在基准日期最后一次出现的设备数 (流失) 间隔N天首次活跃在基准日期前N天从未活跃,而在基准日期活跃的设备数 中断N天数量在基准日期活跃,且之后连续N天未活跃的设备数 中断N天比例中断N天数量 / 设备数量 N天复活数量在基准日期活跃,之后中断N天,但在第N+1天又活跃的设备数 N天复活比例N天复活数量 / 设备数量
步骤 5: 通用分析
功能: 不区分具体型号,仅按 全部、巴伦、非巴伦 三个大类进行整体分析。
- 方法:
analyzeGeneral() - 输入文件:
monthMerge.csv
- 输出文件: (生成在
最终分析结果_*/目录下)活跃天数统计(开始-结束).csv/xlsx- 表头:
活跃天数,设备数量 - 含义: 统计每个活跃天数对应的设备数量分布。
- 表头:
设备活跃中断分析(开始-结束).csv/xlsx- 表头: 与步骤 4 相同,但不包含
设备型号字段。 - 含义: 整体的活跃、中断、复活指标。
- 表头: 与步骤 4 相同,但不包含
步骤 6: 结果排序
功能: 对模型分析生成的结果进行排序,便于查看主要型号的数据。
- 方法:
sortResults() - 输入文件:
- 步骤 4 生成的
设备型号活跃变化(详细_*.csv
- 步骤 4 生成的
- 输出文件:
*_排序.csv*_排序.xlsx
- 表头: 与步骤 4 输出完全一致,仅数据顺序改变。
- 排序规则: 优先按
该型号的总活跃量(倒序),其次按基准日期(升序)。
步骤 7: 生成报表
功能: 将分析结果入库,并计算稳定性指标。
- 方法:
generateReport() - 输入文件:
- 步骤 6 排序后的 CSV 文件 (或步骤 4 的原始文件)
- 输出文件:
- 数据库表:
device_model_activity_detail(字段对应步骤 4 的 CSV 列) - 稳定性报告:
analysis_result/设备型号稳定性分析.csv- 表头:
设备型号,统计天数,平均日活,最大日活,最小日活,标准差,变异系数,稳定性评级 - 字段含义:
字段名 含义 设备型号被分析的设备型号 统计天数该型号有数据的天数 平均日活统计周期内的平均日活跃设备数 最大/最小日活周期内的峰值和谷值 标准差反映日活数据的波动程度 变异系数标准差 / 平均日活,用于横向对比不同量级型号的稳定性 稳定性评级基于变异系数的自动评级 (极稳定/稳定/中等波动/剧烈波动)
- 表头:
- 数据库表:
5. 配置说明
修改 cn.akrdinfo.util.device.deviceactivity_v2.config.AnalysisConfig 类来调整配置:
// 基础数据与输出目录
private String baseDir = "C:\\work\\数据分析\\设备活跃\\202601\\";
// 统计时间范围 (用于日期压缩映射和报表生成)
private int beginDay = 20250701;
private int endDay = 20260120;
// 最大中断/复 活追踪天数 (影响CSV列数)
private int maxInterruptDay = 7;
// 批处理大小 (Hash分片数,越大内存占用越小但文件数越多)
private int batchCount = 10;
// 基础数据文件配置 (默认在 baseDir 下)
// baseDeviceDdlPath = baseDir + "base_device_data_ddl.sql"
// balunMacPath = baseDir + "balun-mac.txt"
// baseDeviceCsvPath = baseDir + "base_device.csv"
// 数据库配置
private String dbUrl = "jdbc:mysql://localhost:3306/ik_data?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private String dbUser = "ik";
private String dbPass = "password";