【用户行为归因分析项目】大数据离线数仓项目完整开发流程
本次设计开发流程记录在专栏中,持续更新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 = '应用安装渠道分析应用表';