6.1 离线数仓—ADS层用户主题需求的实现

本文详细介绍了如何在ADS层实现用户变动统计、留存率、新增活跃统计、行为漏斗分析和新增交易用户统计的需求。通过需求分析、建表语句和数据装载步骤,展示了在Hive中进行SQL操作来完成用户行为数据的处理和计算,旨在提升数据仓库的分析能力。
摘要由CSDN通过智能技术生成


前言

前面完成了DWS层流量主题需求的设计和开发,下面进行ADS层用户主题的设计和开发。

一、用户变动统计

1.需求说明和分析

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

需求编号 统计周期 指标 说明
需求1 最近1日 流失用户数 之前活跃过的用户,最近一段时间未活跃,就称为流失用户。此处要求统计7日前(只包含7日前当天)活跃,但最近7日未活跃的用户总数。
需求2 最近1日 回流用户数 之前的活跃用户,一段时间未活跃(流失),今日又活跃了,就称为回流用户。此处要求统计回流用户总数。

2)需求分析
需求1:要求7日前活跃但最近7日未活跃的用户总数,可以通过用户的最后登录时间来判断是否符合条件。
需求2:找到当天登录的用户,且7天内未登录的用户。

2.建表语句

根据需求分析,可以知道,该表中应该包含的字段有:日期、流失用户数、回流用户数,所以建表语句如下:

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'
    LOCATION '/warehouse/gmall/ads/ads_user_change/';

3.数据装载

如何求流失用户数:这里求的是每日新增的流失用户数,所以只要确定用户的最后登录日期在8天前的当天即可。
语句如下:

	select
        '2020-06-14' dt,
    	count(*) user_churn_count
    from dws_user_user_login_td
    where dt='2020-06-14'
    and login_date_last=date_add('2020-06-14',-7)

如何求回流用户数:先找到当天登录了的用户,再找到这些用户在这次登录前最后一次登录的时间(其实这个时间就是td表前一天分区里的时间),时间差大于等于8就代表是回流用户。
语句如下:

select
        '2020-06-14' dt,
        count(*) user_back_count
    from
    (
        select
            user_id,
            login_date_last
        from dws_user_user_login_td
        where dt='2020-06-14'
    )t1
    join
    (
        select
            user_id,
            login_date_last login_date_previous
        from dws_user_user_login_td
        where dt=date_add('2020-06-14',-1)
    )t2
    on t1.user_id=t2.user_id
    where datediff(login_date_last,login_date_previous)>=8

将两个字段的值join起来就得到了最终的数据:

insert overwrite table ads_user_change
select * from ads_user_change
union
select
    churn.dt,
    user_churn_count,
    user_back_count
from
(
    select
        '2020-06-14' dt,
        count(*) user_churn_count
    from dws_user_user_login_td
    where dt='2020-06-14'
    and login_date_last=date_add('2020-06-14',-7)
)churn
join
(
    select
        '2020-06-14' dt,
        count(*) user_back_count
    from
    (
        select
            user_id,
            login_date_last
        from dws_user_user_login_td
        where dt='2020-06-14'
    )t1
    join
    (
        select
            user_id,
            login_date_last login_date_previous
        from dws_user_user_login_td
        where dt=date_add('2020-06-14',-1)
    )t2
    on t1.user_id=t2.user_id
    where datediff(login_date_last,login_date_previous)>=8
)back
on churn.dt=back.dt;

二、用户留存率

1.需求说明和分析

1)需求说明
       留存分析一般包含新增留存活跃留存分析
       新增留存分析是分析某天的新增用户中,有多少人有后续的活跃行为。活跃留存分析是分析某天的活跃用户中,有多少人有后续的活跃行为。
       留存分析是衡量产品对用户价值高低的重要指标。
       此处要求统计新增留存率,新增留存率具体是指留存用户数与新增用户数的比值,例如2020-06-14新增100个用户,1日之后(2020-06-15)这100人中有80个人活跃了,那2020-06-14的1日留存数则为80,2020-06-14的1日留存率则为80%。
       要求统计每天的1至7日留存率,如下图所示。
在这里插入图片描述
2)需求分析
根据需求可知,要包含以下字段:统计日期、新增用户日期、从新增到今天的天数、留存用户数量、新增用户数量、留存率

2.建表语句

DROP TABLE IF EXISTS ads_user_retention;
CREATE EXTERNAL TABLE ads_user_retention
(
    `dt`              STRING COMMENT '统计日期',
    `create_date`     STRING COMMENT '用户新增日期',
    `retention_day`   INT COMMENT '截至当前日期留存天数',
    `retention_count` BIGINT COMMENT '留存用户数量',
    `new_user_count`  BIGINT COMMENT '新增用户数量',
    `retention_rate`  DECIMAL(16, 2) COMMENT '留存率'
) COMMENT '用户留存率'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    LOCATION '/warehouse/gmall/ads/ads_user_retention/';

3.数据装载

3.1我的思路

假如拿到的是2020-06-14日的数据,那么可以计算2020-06-13、2020-06-12…等7天的留存率,先计算2020-6-13日的留存率。
1)先拿到2020-06-14日的活跃用户

  select
    user_id,
    dt
  from dwd_user_login_inc
  where dt='2020-06-14'

2)再拿到2020-06-13日的注册用户

  select
    inc_dt,
    user_id
  from dwd_user_register_inc
  where dt='2020-06-13'

3)两张表中共有的用户是2020-06-13日新增用户在2020-06-14日的留存用户,将两张表关联起来,算出2020-06-13日的留存率

select
  '2020-06-14',
  '2020-06-13',
  1,
  sum(if(t2.user_id is not null,1,0)),
  count(*),
  sum(if(t2.user_id is not null,1,0))/count(*)
from
(
  select
    inc_dt,
    user_id
  from dwd_user_register_inc
  where dt='2020-06-13'
)t1
left join
(
  select
    user_id,
    dt
  from dwd_user_login_inc
  where dt='2020-06-14'
)t2
on t1.user_id=t2.user_id

拿到2020-06-13所有的注册用户跟2020-6-14登录的用户左连接,右边不为null则代表是留存用户
4)同理,2020-06-12的留存率如下:

select
  '2020-06-14',
  '2020-06-12',
  2,
  sum(if(t2.user_id is not null,1,0)),
  count(*),
  sum(if(t2.user_id is not null,1,0))/count(*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值