用户留存建模实践
一 问题思考
1. 历史库方式:基于T+1全量和当日增量构建全量历史库,基于历史库再聚合
2. 轻度聚合后再聚合:构建T+1的轻度聚合模型,多周期扫描再聚合
3. 历史周期计拉链:以固定时间窗口方式构建用户标签表,计算时关联标签表再聚合
4. 位图模式计算:以滑动时间窗口方式构建用户标签表,并以位图存储窗口周期信息
二 用户故事
三 设计实现
目标抽象:用户留存模型的建模抽象与组件构建(支持超过64位图的1/7/30/180天等周期性PV-UV、留存、互访、新老客等指标的一站式计算);
解决问题:存在大量的暴力扫描、低效计算、高昂历史回刷成本、数据冷启动等问题,而高效的留存模型的设计和研发门槛高(位图计算方式等)、缺少标准化的模型沉淀;
解决方案:提炼窗口滑动计算的建模范式、沉淀留存建模组件,显著提升研发效率(0.5人日),支持留存/互访/新老客等一站式计算;
1 模型抽象
维度抽象:用户留存模型是典型的轻度聚合模型DWS,显然要有聚合维度列。
设计抽象:滑动窗口设计:首先需要记录时间窗口内的用户行为分布(UV或PV),并通过某种数据结构来保存(如bit的Long值存储或者是Array<Bigint>);其次要设计好窗口滑动的更新逻辑;
信息抽象:关键聚合信息,如新客的判断(N+1的时间窗口内,第N天首次访问就是新用户);last_date的数值化信息保留(累计多少天未访问,有效减少存储);累计访问天数(支持访问天数分布的人群分析);
2 模型组件
jar -classpath 云端文件/res?id=xxx 类名.tools.OdpsCltWrapper
"--class" <留存模型的jar包>
"--properties-file" 云端文件/res?id=xxx
"--conf" <spark配置文件>
"--conf" "spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
"--conf" "spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
"--master" yarn-cluster
云端文件/res?id=xxx "--rTable" <输入表的表名> "--wTable" <输出表的表名: 即构建的留存模型> "--stat_date" ${bizdate} "--window" 180;
3 下游使用
--报表引用
insert overwrite table <留存矩阵_接口表> partition (dt='${bizdate}')
select spm,
date_row,
date_col,
retn_vst_uv_1d
from 留存矩阵分析_参数化视图(留存模型table_name,'20211208')
where spm = 'XXX'
;
--计算引用
insert overwrite table <留存概览_接口表> partition (dt='${bizdate}')
select vst_uv_1d,vst_uv_7d,vst_uv_30d,fst_uv_1d,retn_vst_uv_matrix,...
from 基础留存分析_参数化视图(留存模型table_name,'20211208')
where spm = 'XXX'
;
四 简要总结
建标准:构建了基于滑动窗口实现的标准化留存模型,实现模型设计和数据计算上的改进,有效解决了历史库版本迭代的高额运维与存储成本、下游的多周期扫描、频繁计算和历史库冷启动等一系列问题。
提效率:研发效率显著提升(分钟级实现用户流量模型的标准化构建),让我们在及实现。
提效率:30min左右即可完成100亿的留存模型计算。
降存储:相比历史库设计可有效降低4倍存储、且信息更完备。
“第益课”大学生技术公益实践计划限时报名中
想不想用代码做一些酷炫的事情?2022年,码上公益联合阿里巴巴公益基金会、阿里云开发者学堂、InfoQ发起“第益课”大学生技术公益实践计划,为高校大学生提供免费的技术课程及公益项目实践机会(等同于实习经验)。让我们一起用技术的力量,做公益的侠客,给世界带来一点点温暖的改变。点击阅读原文查看详情!
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章