跳到主要内容

设备型号活跃分析 (重构版 V2)

核心概念:研发文档 | 设备型号活跃分析 (重构版 V2) | 概览

本文档详细介绍了设备型号活跃分析工具(V2)的架构、数据流转及执行方法。该工具用于分析海量设备日志,计算设备活跃、留存、流失及复活等关键指标。

1. 简介

重构后的分析工具位于 cn.akrdinfo.util.device.deviceactivity_v2 包下,旨在提供更清晰的模块划分、更高效的内存管理(基于Hash分片和日期压缩)以及分步执行的能力。

核心功能

  • 数据预处理:从 SQL DDL 提取基础数据,将分散的日/月度CSV文件合并,并进行MAC Hash分片和日期压缩。
  • 模型分析:按设备型号维度,计算活跃、中断(留存)、复活等指标。
  • 通用分析:进行整体分析(全部/巴伦/非巴伦),不按型号分组。
  • 结果排序:对分析结果按活跃量和日期进行排序。
  • 报表生成:将结果导入数据库,并生成稳定性分析报告。

2. 系统架构

工具采用了分层架构,各模块职责单一,可独立运行。

Mermaid Diagram Code:

classDiagram
    class DeviceActivityAnalysisApp {
        +prepareBaseData()
        +convertDailyToMonthly()
        +mergeMonthlyData()
        +analyzeByModel()
        +analyzeGeneral()
        +sortResults()
        +generateReport()
    }

    class AnalysisConfig {
        +BaseDir
        +DBConfig
        +BatchCount
    }

    class DataPreProcessor {
        +processBaseData()
        +convertDailyToMonthly()
        +mergeMonthlyToTotal()
        -HashPartitioning
        -DateCompression
    }

    class ModelActivityAnalyzer {
        +analyze()
        -readAndCalculate()
        -writeCsv()
        -writeExcel()
    }

    class GeneralActivityAnalyzer {
        +analyze()
        -readDeviceActivityData()
        -exportToCsv()
        -exportToExcel()
    }

    class ResultPostProcessor {
        +sortAndExportBatch()
    }

    class AnalysisReporter {
        +generateReport()
        -initTable()
        -batchInsert()
    }

    DeviceActivityAnalysisApp --> AnalysisConfig
    DeviceActivityAnalysisApp --> DataPreProcessor : "Pre-processing"
    DeviceActivityAnalysisApp --> ModelActivityAnalyzer : "Model Analysis"
    DeviceActivityAnalysisApp --> GeneralActivityAnalyzer : "General Analysis"
    DeviceActivityAnalysisApp --> ResultPostProcessor : "Sorting"
    DeviceActivityAnalysisApp --> AnalysisReporter : "Reporting"

3. 数据流转

数据处理流程分为七个主要阶段,每个阶段都有明确的输入和输出。

Mermaid Diagram Code:

graph TD
    %% 节点定义
    DDL["SQL DDL & Balun TXT"]
    Base["基础数据 CSV<br/>(base_device.csv)"]
    Daily["天级明细 CSV<br/>(device_activity_detail_*)"]
    Monthly["月度结果 CSV<br/>(month_result_*)"]
    Total["合并总表<br/>(monthMerge.csv)"]
    ResultDir["模型结果目录<br/>(deviceModel/{timestamp})"]
    GeneralDir["通用结果目录<br/>(最终分析结果_*)"]
    Sorted["排序后结果<br/>(*_排序.csv/xlsx)"]
    DB[("MySQL 数据库<br/>(device_model_activity_detail)")]
    Stats["稳定性报告<br/>(设备型号稳定性分析.csv)"]

    %% 流程
    subgraph "基础数据准备"
    DDL -->|DataPreProcessor.processBaseData| Base
    end

    subgraph "天级转月度"
    Daily -->|DataPreProcessor.convertDailyToMonthly| Monthly
    Base -->|关联型号与巴伦属性| Monthly
    end

    subgraph "数据合并"
    Monthly -->|"DataPreProcessor.mergeMonthlyToTotal<br/>(Hash分片 + 日期压缩)"| Total
    end

    subgraph "模型分析"
    Total -->|ModelActivityAnalyzer.analyze| ResultDir
    end

    subgraph "通用分析"
    Total -->|GeneralActivityAnalyzer.analyze| GeneralDir
    end

    subgraph "结果排序"
    ResultDir -->|ResultPostProcessor.sortAndExportBatch| Sorted
    end

    subgraph "报表生成"
    Sorted -->|AnalysisReporter.generateReport| DB
    Sorted -->|AnalysisStatsService| Stats
    end

关键技术点

  1. MAC Hash 分片 为了防止一次性加载过大数据导致 OOM,在合并数据时,工具根据 mac.hashCode() % batchCount 将数据分为多个批次处理。每次只将属于当前批次的数据加载到内存中进行聚合。

  2. 日期压缩 (DateCustomMap) 在内存处理过程中,将 yyyyMMdd 格式的日期转换为 Base62 编码的短字符串(如 "A", "B", "1z"),极大地减少了 Set<String> 的内存占用。写入文件时会自动解码回原始日期。

4. 详细执行指南

入口类:cn.akrdinfo.util.device.deviceactivity_v2.DeviceActivityAnalysisApp

步骤 1: 基础数据准备

功能: 从 SQL DDL 导出文件和巴伦芯片名单中提取设备基础信息,生成标准化的 CSV 文件。

  • 方法: prepareBaseData()
  • 输入文件:
    1. base_device_data_ddl.sql (数据库备份,含 INSERT INTO 语句)
    2. balun-mac.txt (巴伦芯片 MAC 地址列表,每行一个 MAC)
  • 输出文件: base_device.csv
    • 表头: mac,cpu,设备型号,是否巴伦
    • 字段含义:
      字段名含义
      macMAC 地址
      cpu芯片型号 (如 HI3798MV300)
      设备型号设备的具体型号名称 (如 EC6108V9)
      是否巴伦标识该设备是否使用巴伦芯片 (/)

步骤 2: 天级转月度 (可选)

功能: 将原始的天级活跃日志聚合为月度活跃数据,并在此过程中直接关联设备型号和巴伦属性。

  • 方法: convertDailyToMonthly()
  • 输入文件:
    1. device_activity_detail_YYYYMM.csv (天级明细)
      • 表头: mac,cpu,recordTime
    2. base_device.csv (由步骤 1 生成)
      • 表头: mac,cpu,设备型号,是否巴伦
  • 输出文件: month_result_YYYYMM.csv
    • 表头: mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合
    • 字段含义:
      字段名含义
      macMAC 地址
      cpu芯片型号
      设备型号设备型号
      活跃天数该月内的总活跃天数
      是否巴伦是否巴伦芯片 (/)
      活跃日期集合该月内所有活跃日期的拼接 (如 `20260101

步骤 3: 数据合并

功能: 将分散的多个月度结果文件合并为一个总表,同时进行 MAC 去重和日期合并。

  • 方法: mergeMonthlyData()
  • 输入文件:
    1. 多个 month_result_*.csv 文件
      • 表头: mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合
  • 输出文件: monthMerge.csv
    • 表头: mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合
    • 字段含义:
      字段名含义
      macMAC 地址
      cpu芯片型号
      设备型号设备型号
      活跃天数统计周期内的总活跃天数
      是否巴伦是否巴伦芯片 (/)
      活跃日期集合所有活跃日期集合,使用 `

步骤 4: 模型分析

功能: 基于合并后的总表,按设备型号分组,计算每日的活跃、新增、流失、中断和复活数据。

  • 方法: analyzeByModel()
  • 输入文件:
    1. monthMerge.csv
      • 表头: mac,cpu,设备型号,活跃天数,是否巴伦,活跃日期集合
  • 输出文件: (生成在 config.baseDir/deviceModel/{timestamp}/ 目录下)
    1. 设备型号活跃变化(详细).xlsx
    2. 设备型号活跃变化(详细_全部).csv
    3. 设备型号活跃变化(详细_仅巴伦).csv
    4. 设备型号活跃变化(详细_非巴伦).csv
    • 表头及含义:
      字段名含义
      基准日期统计的参考日期 (yyyyMMdd)
      设备型号聚合维度
      设备数量该型号在基准日期的活跃总数
      今日新增活跃在基准日期首次出现的设备数
      今日后不再活跃设备数在基准日期最后一次出现的设备数 (流失)
      间隔N天首次活跃在基准日期前N天从未活跃,而在基准日期活跃的设备数
      中断N天数量在基准日期活跃,且之后连续N天未活跃的设备数
      中断N天比例中断N天数量 / 设备数量
      N天复活数量在基准日期活跃,之后中断N天,但在第N+1天又活跃的设备数
      N天复活比例N天复活数量 / 设备数量

步骤 5: 通用分析

功能: 不区分具体型号,仅按 全部巴伦非巴伦 三个大类进行整体分析。

  • 方法: analyzeGeneral()
  • 输入文件:
    1. monthMerge.csv
  • 输出文件: (生成在 最终分析结果_*/ 目录下)
    1. 活跃天数统计(开始-结束).csv/xlsx
      • 表头: 活跃天数,设备数量
      • 含义: 统计每个活跃天数对应的设备数量分布。
    2. 设备活跃中断分析(开始-结束).csv/xlsx
      • 表头: 与步骤 4 相同,但不包含 设备型号 字段。
      • 含义: 整体的活跃、中断、复活指标。

步骤 6: 结果排序

功能: 对模型分析生成的结果进行排序,便于查看主要型号的数据。

  • 方法: sortResults()
  • 输入文件:
    1. 步骤 4 生成的 设备型号活跃变化(详细_*.csv
  • 输出文件:
    1. *_排序.csv
    2. *_排序.xlsx
    • 表头: 与步骤 4 输出完全一致,仅数据顺序改变。
    • 排序规则: 优先按 该型号的总活跃量 (倒序),其次按 基准日期 (升序)。

步骤 7: 生成报表

功能: 将分析结果入库,并计算稳定性指标。

  • 方法: generateReport()
  • 输入文件:
    1. 步骤 6 排序后的 CSV 文件 (或步骤 4 的原始文件)
  • 输出文件:
    1. 数据库表: device_model_activity_detail (字段对应步骤 4 的 CSV 列)
    2. 稳定性报告: 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";
AI 问答