【用户行为归因分析项目】- 【企业级项目开发第一站】项目架构和需求设计

【用户行为归因分析项目】大数据离线数仓项目完整开发流程

本次设计开发流程记录在专栏中,持续更新ing从零开始搭建大数据离线\实时项目【轻量级】_是阿威啊的博客-CSDN博客

gitee代码仓地址:https://gitee.com/sawa0725/data-ware-house

一、项目背景

根据用户的安装、激活、卸载记录进行归因处理,分析用户app的使用周期

1、需求初步设计

需要将卸载和激活数据都匹配到对应的安装记录,找到安装来源,分析不同安装来源下的激活、卸载、留存的数据。

那么我们最终要呈现的结果分为两部分,第一部分为报表展示,即不同维度的聚合后的数据,形成展示报表;第二部分为API接口,根据用户的传参不同,返回用户需要的指标数据。

2、项目本地化

来源的用户行为数据和用户信息数据以及应用信息都是用scala程序进行模拟

3、业务理解

简化过企业级业务,进行理解学习会更加高效

通过业务实践(安装激活卸载)进行归因,找到每次激活和卸载对应的安装记录,把卸载次数和激活次数归因到安装来源渠道中,并根据业务规则:统计当天如果已安装且激活的设备还未卸载,便判断为留存。每次统计保留六十天内安装的数据进行统计

二、系统架构图

1、大数据平台架构

本项目采用Hadoop作为分布式系统基础框架,存储使用HDFS分布式文件系统,YARN作为集群资源的 "调度中枢",HIVE作为数据仓库,Spark作为大数据处理的 "计算引擎",形成一整套的大数据离线处理平台。

2、项目架构

本项目采用scala进行编程,实现数据生产和采集,spark on hive的数仓模式来做数据处理

mysql同时作为hive的元数据管理数据库以及ADS层的汇总数据存放的数据库。

API的实现通过scala+spring boot 实现服务接口,外层通过postman模拟接口调用

报表展示通过finebi读取mysql数据库实现

具体的架构图如下:

三、数据流图

日常做大数据开发项目和需求时,最重要的莫过于数据流图,清晰的展示数据的流向,为开发定好方向

四、模型设计

1、hadoop目录设计

row层:模拟的数据文件存放目录,按照文件名和日期进行归类

/rawdata/app/install/dt=20251228/

/rawdata/app/activate/dt=20251228/

/rawdata/app/uninstall/dt=20251228/

2、模型设计

一共涉及10个模型,三张ods表,三张dwd表,一张dws表,两张dim表,一张ads的mysql表

企业级数仓中,ODS 层需贴近源数据,按业务域建独立物理表(保证源数据隔离)

DWD 层是企业级数仓的核心,需基于事实表 + 维度表建模,实现业务数据的标准化和维度统一

DWS 层需按 "业务域 + 公共维度" 做轻度汇总,既保证业务隔离,又支持跨业务域分析

|----------------|------------|-------------------------------------|-----------------|
| 分层类型 | 存储引擎 / 格式 | 表名 | 核心定位 |
| Hive-ODS(原始层) | ORC+SNAPPY | ods_app_install_dm | 应用安装原始数据存储 |
| Hive-ODS | ORC+SNAPPY | ods_app_activate_dm | 应用激活原始数据存储 |
| Hive-ODS | ORC+SNAPPY | ods_app_uninstall_dm | 应用卸载原始数据存储 |
| Hive-DIM(维度层) | ORC+SNAPPY | dim_app_info_dm | 应用信息维度全量表 |
| Hive-DIM | ORC+SNAPPY | dim_device_info_dm | 设备信息维度全量表 |
| Hive-DWD(明细层) | ORC+SNAPPY | dwd_app_install_ds | 应用安装明细全量表(关联维度) |
| Hive-DWD | ORC+SNAPPY | dwd_app_activate_dm | 应用激活明细表(关联维度) |
| Hive-DWD | ORC+SNAPPY | dwd_app_uninstall_dm | 应用卸载明细表(关联维度) |
| Hive-DWS(汇总层) | ORC+SNAPPY | dws_app_install_channel_analysis_ds | 应用安装渠道分析汇总表 |
| MySQL-ADS(应用层) | InnoDB | ads_app_install_channel_analysis_dm | 应用安装渠道分析应用表 |

五、模型构建

1. ODS 层(原始数据层,分区表 + ORC 存储,适配离线数仓性能)

(1)ods_app_install_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_app_install_dm (
    device_id STRING COMMENT '设备唯一标识',
    app_id STRING COMMENT '被安装的应用ID',
    install_channel_id STRING COMMENT '安装来源渠道ID(本质是应用ID)',
    install_time TIMESTAMP COMMENT '安装时间',
    file_name String COMMENT '来源文件名'
)
COMMENT '应用安装原始数据表'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/ods/ods_app_install_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用安装原始数据,每日增量同步'
);

(2)ods_app_activate_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_app_activate_dm (
    device_id STRING COMMENT '设备唯一标识',
    app_id STRING COMMENT '被激活的应用ID',
    activate_time TIMESTAMP COMMENT '激活时间',
    file_name String COMMENT '来源文件名'
)
COMMENT '应用激活原始数据表'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/ods/ods_app_activate_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用激活原始数据,每日增量同步'
);

(3)ods_app_uninstall_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_app_uninstall_dm (
    device_id STRING COMMENT '设备唯一标识',
    app_id STRING COMMENT '被卸载的应用ID',
    uninstall_time TIMESTAMP COMMENT '卸载时间',
    file_name String COMMENT '来源文件名'
)
COMMENT '应用卸载原始数据表'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/ods/ods_app_uninstall_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用卸载原始数据,每日增量同步'
);

2. DIM 层(维度表,全量表 + ORC 存储,关联业务事实表)

(1)dim_app_info_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS dim.dim_app_info_dm (
    app_id STRING COMMENT '应用唯一ID',
    app_name STRING COMMENT '应用名称',
    app_category STRING COMMENT '应用分类(如:电商、工具、游戏)',
    update_time TIMESTAMP COMMENT '维度数据更新时间'
)
COMMENT '应用信息维度表'
STORED AS ORC
LOCATION '/user/hive/warehouse/dim/dim_app_info_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用基础信息维度,全量更新'
);

(2)dim_device_info_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS dim.dim_device_info_dm (
    device_id STRING COMMENT '设备唯一标识',
    device_model STRING COMMENT '设备型号(如:iPhone 15、Mate 60 Pro)',
    device_brand STRING COMMENT '设备品牌(如:苹果、华为、小米)',
    device_price DECIMAL(10,2) COMMENT '设备价格(单位:元)',
    update_time TIMESTAMP COMMENT '维度数据更新时间'
)
COMMENT '设备信息维度表'
STORED AS ORC
LOCATION '/user/hive/warehouse/dim/dim_device_info_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '设备基础信息维度,全量更新'
);

3. DWD 层(明细层,关联维度 + 标准化,分区表 + ORC 存储)

(1)dwd_app_install_ds(全量表)

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS dwd.dwd_app_install_ds (
    device_id STRING COMMENT '设备唯一标识',
    device_model STRING COMMENT '设备型号',
    device_brand STRING COMMENT '设备品牌',
    device_price DECIMAL(10,2) COMMENT '设备价格',
    install_app_id STRING COMMENT '被安装的应用ID',
    install_app_name STRING COMMENT '被安装的应用名称',
    install_app_category STRING COMMENT '被安装的应用分类',
    install_channel_id STRING COMMENT '安装来源渠道ID(应用ID)',
    channel_app_name STRING COMMENT '来源渠道应用名称',
    channel_app_category STRING COMMENT '来源渠道应用分类',
    install_time TIMESTAMP COMMENT '安装时间',
    etl_time TIMESTAMP COMMENT 'ETL处理完成时间'
)
COMMENT '应用安装明细全量表(关联设备/应用维度)'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/dwd/dwd_app_install_ds'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用安装明细,每日全量覆盖'
);

(2)dwd_app_activate_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS dwd.dwd_app_activate_dm (
    device_id STRING COMMENT '设备唯一标识',
    app_id STRING COMMENT '被激活的应用ID',
    activate_time TIMESTAMP COMMENT '激活时间',
    device_model STRING COMMENT '设备型号',
    device_brand STRING COMMENT '设备品牌',
    device_price DECIMAL(10,2) COMMENT '设备价格',
    app_name STRING COMMENT '应用名称',
    app_category STRING COMMENT '应用分类',
    etl_time TIMESTAMP COMMENT 'ETL处理完成时间'
)
COMMENT '应用激活明细数据表(关联设备/应用维度)'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/dwd/dwd_app_activate_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用激活明细,每日增量同步'
);

(3)dwd_app_uninstall_dm

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS dwd.dwd_app_uninstall_dm (
    device_id STRING COMMENT '设备唯一标识',
    app_id STRING COMMENT '被卸载的应用ID',
    uninstall_time TIMESTAMP COMMENT '卸载时间',
    device_model STRING COMMENT '设备型号',
    device_brand STRING COMMENT '设备品牌',
    device_price DECIMAL(10,2) COMMENT '设备价格',
    app_name STRING COMMENT '应用名称',
    app_category STRING COMMENT '应用分类',
    etl_time TIMESTAMP COMMENT 'ETL处理完成时间'
)
COMMENT '应用卸载明细数据表(关联设备/应用维度)'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/dwd/dwd_app_uninstall_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用卸载明细,每日增量同步'
);

4. DWS 层(汇总层,聚合指标 + 维度,分区表 + ORC 存储)

sql 复制代码
CREATE EXTERNAL TABLE IF NOT EXISTS dws.dws_app_install_channel_analysis_ds (
    device_model STRING COMMENT '设备型号',
    device_brand STRING COMMENT '设备品牌',
    device_price_range DECIMAL(10,2) COMMENT '设备价格范围',
    install_app_id STRING COMMENT '被安装的应用ID',
    install_app_name STRING COMMENT '被安装的应用名称',
    install_app_category STRING COMMENT '被安装的应用分类',
    install_channel_id STRING COMMENT '安装来源渠道ID(应用ID)',
    channel_app_name STRING COMMENT '来源渠道应用名称',
    channel_app_category STRING COMMENT '来源渠道应用分类',
    activate_cnt BIGINT COMMENT '激活次数',
    uninstall_cnt BIGINT COMMENT '卸载次数',
    retain_device_cnt BIGINT COMMENT '留存设备数',
    etl_time TIMESTAMP COMMENT 'ETL处理完成时间'
)
COMMENT '应用安装渠道分析汇总表'
PARTITIONED BY (dt STRING COMMENT '分区字段,格式:yyyyMMdd')
STORED AS ORC
LOCATION '/user/hive/warehouse/dws/dws_app_install_channel_analysis_dm'
TBLPROPERTIES (
    'orc.compress' = 'SNAPPY',
    'comment' = '应用安装渠道维度汇总,60天内安装记录的全量统计'
);

5、MySQL 建表语句(ADS 层,面向应用查询,优化索引)

sql 复制代码
CREATE TABLE IF NOT EXISTS ads.ads_app_install_channel_analysis_dm (
    id BIGINT AUTO_INCREMENT COMMENT '自增主键',
    device_model VARCHAR(100) COMMENT '设备型号',
    device_brand VARCHAR(50) COMMENT '设备品牌',
    device_price_range DECIMAL(10,2) COMMENT '设备价格',
    install_app_id VARCHAR(64) COMMENT '被安装的应用ID',
    install_app_name VARCHAR(100) COMMENT '被安装的应用名称',
    install_app_category VARCHAR(50) COMMENT '被安装的应用分类',
    install_channel_id VARCHAR(64) COMMENT '安装来源渠道ID(应用ID)',
    channel_app_name VARCHAR(100) COMMENT '来源渠道应用名称',
    channel_app_category VARCHAR(50) COMMENT '来源渠道应用分类',
    activate_cnt BIGINT COMMENT '激活次数',
    uninstall_cnt BIGINT COMMENT '卸载次数',
    retain_device_cnt BIGINT COMMENT '留存设备数',
    dt VARCHAR(8) COMMENT '分区字段,格式:yyyyMMdd',
    etl_time DATETIME COMMENT 'ETL处理完成时间',
    PRIMARY KEY (id),
    -- 联合索引:优化按日期+渠道+应用的查询(核心查询维度)
    INDEX idx_dt_channel_app (dt, install_channel_id, install_app_id),
    -- 单索引:优化按设备品牌/型号的查询
    INDEX idx_device_brand (device_brand),
    INDEX idx_device_model (device_model)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '应用安装渠道分析应用表';
相关推荐
消失的旧时光-19432 小时前
Flutter 中 mixin 的完整认知体系——从原理、范式、架构选择到反模式(工程实战版)
flutter·架构
Godspeed Zhao2 小时前
现代智能车机系统1——EEA架构(0)
架构·汽车
qq_12498707532 小时前
基于spark的西南天气数据的分析与应用(源码+论文+部署+安装)
大数据·分布式·爬虫·python·spark·毕业设计·数据可视化
STLearner2 小时前
2025时空数据研究工作总结
大数据·人工智能·python·深度学习·学习·机器学习·智慧城市
心止水j2 小时前
spark rdd
大数据·分布式·spark
Sui_Network2 小时前
Sui 2025 年终回顾:支付、BTC 与机构采用篇
大数据·人工智能·物联网·web3·去中心化·区块链
小股虫2 小时前
事件驱动架构:如何让实时点击与异步积分在增长中台和谐共舞?
微服务·架构·团队建设·方法论
天天进步20152 小时前
【Nanobrowser源码分析2】架构篇: 探究 Nanobrowser 的核心组件与通信模型
架构