一种通过构建周期快照事实表优化用户回流、流失统计指标的方法

目录

1 需求说明

2 数据探索

3 模型优化

3.1  7天流失用户

3.2  7天回流用户

4 ADS层模型设计

5 小结


1 需求说明

该需求包括两个指标,分别为流失用户数和回流用户数,以下为对两个指标的解释说明。

统计周期

指标

说明

最近1日(每天的新增流失用户数)

流失用户数

之前活跃过的用户,最近一段时间未活跃,就称为流失用户。此处要求统计7日前(只包含7日前当天)活跃,但最近7日未活跃的用户总数。

最近1日(每天的新增回流用户数)

回流用户数

之前的活跃用户,一段时间未活跃(流失),今日又活跃了,就称为回流用户。此处要求统计回流用户总数。

2 数据探索

      (1)数据调研,该指标可以从用户登录表计算

       (2)直接计算

第一步计算:7天前登录的用户
第二步计算:计算近7天登录的用户
7天前登录的用户
left join 近7天登录的用户

用户登录表数据量非常大,如果这样直接关联相当于大表关联,性能相当差

3 模型优化

3.1 7天流失用户

定义:7日前用户活跃,但最近7日未活跃。换句话说就是用户超过7天未登录APP,如果用户最近一次登录时间为7天前,也就是该用户超过7天未登录。所以我们构建用户登录收敛表。结构如下:

user_id

用户id

login_date_last

用户最近一次登录日期

此时只需要在DWS层维护构建一张用户历史至今的末次登录时间周期快照表

表设计

命名:dws_user_user_login_td

td:截止至今

user:数据域

user_login:表示用户登录事实。

具体建表如下:

DROP TABLE IF EXISTS dws_user_user_login_td;
CREATE EXTERNAL TABLE dws_user_user_login_td
(
    `user_id`         STRING COMMENT '用户id',
    `login_date_last` STRING COMMENT '末次登录日期',
    `login_count_td`  BIGINT COMMENT '累计登录次数'
) COMMENT '用户域用户粒度登录历史至今汇总事实表'
    PARTITIONED BY (`dt` STRING)
    STORED AS ORC
    TBLPROPERTIES ('orc.compress' = 'snappy');

那么流失用户根据以上分析可以进行如下计算:

select
    count(*)
from dws_user_user_login_td
where dt =current_date
and login_date_last=date_add(current_date,-7);

总结:流失用户特征,用户最近一次登录时间距离当天已经达到7天

因此我们可以定义7日流失,14日流失,30日流失,90天流失,方法一致

3.2 7天回流用户

定义: 7天前未活跃,今日活跃了

特征:(1)用户两次登录时间间隔7天以上

           (2) 最后登录日期(今日)减去上次登录日期大于等于8的用户

因此问题的难点转换为如何求用户上次登录的日期,通过上述分析我们注意到,回流用户一定是当日的活跃用户,但对于昨天而言该用户还属于流失用户,即昨天的最后登录日期在7天之前

(1)获取当日活跃用户

使用用户历史至今的末次登录时间表

select user_id,
       login_date_last
from dws_user_user_login_td
where dt = current_date
  and login_date_last = current_date;
(2)获取昨日分区的数据
select user_id,
       login_date_last
from dws_user_user_login_td
where dt = date_add(current_date,-1)

(3)  两表join,取登录间隔大于等于8天的用户

select count(*)
from (select user_id,
             login_date_last
      from dws_user_user_login_td
      where dt = current_date
        and login_date_last = current_date) t1
join
     (select user_id,
             login_date_last
      from dws_user_user_login_td
      where dt = date_add(current_date, -1)
) t2
     on t1.user_id = t2.user_id
where datediff(t1.login_date_last,t2.login_date_last)>=8

4 ADS层模型设计

建表如下:

DROP TABLE IF EXISTS ads_user_change;
CREATE EXTERNAL TABLE ads_user_change
(
    `dt`               STRING COMMENT '统计日期',
    `user_churn_count` BIGINT COMMENT '流失用户数',
    `user_back_count`  BIGINT COMMENT '回流用户数'
) COMMENT '用户变动统计'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'


两个指标合并:采用UNION ALL

select 
       dt,
       sum(user_churn_count) user_churn_count,
       sum(user_back_count) user_back_count
from (
    select
           current_date dt,
           count(*) user_churn_count,
		   null user_back_count
      from
           dws_user_user_login_td
      where dt = current_date
        and login_date_last = date_add(current_date, -7)
union all
    select
           current_date dt,
		   null user_churn_count,
           count(*) user_back_count
from (
    select
             user_id,
             login_date_last
      from
           dws_user_user_login_td
      where dt = current_date
        and login_date_last = current_date) t1
         inner join
     (
         select
             user_id,
             login_date_last
      from
           dws_user_user_login_td
      where dt = date_add(current_date, -1)
         ) t2
     on t1.user_id = t2.user_id
where datediff(t1.login_date_last,t2.login_date_last)>=8
)
group by dt

5 小结

 本文分析了一种通过数仓建模的形式来优化指标计算的方式,针对用户回流及流失这两个指标进行优化,通过对指标的分析,在DWS层构建周期快照事实表,维护用户历史至今末次登录时间周期快照表,简化了指标的计算,提升了性能。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值