Hive SQL 多日留存计算

本文介绍了如何使用Hive SQL解决多日留存计算的问题,详细阐述了需求、问题分析、求解过程以及结果对比,包括数据准备、计算过程,并验证了预期结果与实际计算结果的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、需求

二、问题分析

1.测试数据情况

2.求解分析

三、求解过程

1.数据准备

2.计算过程

四、正确结果与计算结果对比

1.预期结果

2.计算结果


一、需求

        留存、留存率是用于反映网站、互联网应用或网络游戏等运营情况的统计指标,因此计算留存、留存率是数据分析及数据工程师是常见的需求。对于求单日的1日、2日、3日、7日等留存指标,相对较为简单;对于分析一段时间内的留存情况,求一段时间内的各日的1日、2日、3日等留存,较为复杂。

二、问题分析

1.测试数据情况

        测试数据包括三个字段,用户id,用户注册日期,用户登陆日期(活跃日期)。测试数据在天粒度已去重。

2.求解分析

留存:注册用户在N日后的活跃(登录)用户数。

计算留存:

        则要以注册日期为分组基础,对用户id进行count()汇总;

        同时要以留存天数为分组汇总的字段,对用户id进行count()汇总;

        留存天数 = 用户登陆日期 - 用户注册日期

故需要以用户注册日期、留存天数为分组字段,最终count(用户id)得到各个日期的用户留存情况。

三、求解过程

1.数据准备

-- 1.建表语句
drop table test_retention;
create table test_retention(
    user_id string
    ,regist_time string 
    ,active_time string
)
partitioned by ( dt string )
;


-- 测试数据插入语句
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table test_retention partition (dt)
    select 'uid_1' as user_id,'2021-08-01' as regist_time,'2021-08-01' as active_time,'2021-08-01' as dt
    union all
    select 'uid_2' as user_id,'2021-08-01' as regist_time, '2021-08-01' as active_time,'2021-08-01' as dt
    union all
    select 'uid_3' as user_id,'2021-08-01' as regist_time, '2021-08-01'  as active_time,'2021-08-01' as dt
    union all
    select 'uid_4' as user_id,'2021-08-01' as regist_time, '2021-08-01' as active_time,'2021-08-01' as dt
    union all
    select 'ui
### 使用 HiveSQL 计算留存率 为了计算留存率,在互联网行业通常关注的是用户在特定时间段内的行为模式。具体来说,如果希望了解新用户的留存情况,则可以通过比较不同时间窗口内活跃的用户数量来实现这一目标。 对于给定的时间周期(如日、周或月),可以定义首次登录日期作为起点,并跟踪这些用户在未来相同长度周期内的再次访问状况。通过这种方式能够评估应用程序保持用户参与度的效果[^2]。 #### 示例数据结构假设 假设有如下表 `user_log` 来记录每次用户的活动: | log_day | device_id | app_id | |---------------|---------------|--------| | YYYY-MM-DD | string | int | 这里 `log_day` 是用户登录的具体日期;`device_id` 和 `app_id` 组合起来唯一标识一位用户。 #### 留存计算逻辑 要计算第 N 天的日留存率,即某天注册的新用户中有多少人在之后的第 N 天也进行了登录操作。这涉及到两个主要部分: 1. 找到每一天新增加的独立用户集合; 2. 对于每一个这样的新用户集合作为基线,查看他们在未来几天是否有重复出现。 基于上述思路,下面给出一段用于计算7日内留存率(HiveQL) 的 SQL 查询语句示例: ```sql WITH new_users AS ( SELECT DISTINCT device_id, MIN(log_day) OVER(PARTITION BY device_id ORDER BY log_day ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) first_login_date FROM user_log ), retained_users_7d AS( SELECT n.device_id FROM new_users n JOIN user_log l ON n.device_id = l.device_id AND datediff(l.log_day,n.first_login_date)=7 ) SELECT DATE_FORMAT(n.first_login_date,'yyyy-MM-dd') as reg_date, COUNT(DISTINCT n.device_id) as total_new_users, COUNT(DISTINCT r.device_id) as retained_users_count, ROUND(COUNT(DISTINCT r.device_id)*100/COUNT(DISTINCT n.device_id),2) as retention_rate_percent FROM new_users n LEFT OUTER JOIN retained_users_7d r USING(device_id) GROUP BY n.first_login_date; ``` 此查询首先创建了一个临时视图 `new_users` ,它包含了每个用户的最早一次登录时间和对应的设备ID。接着构建另一个名为 `retained_users_7d` 的子查询,用来找出那些恰好在初次登录后的第七天上又回来使用的用户群体。最后一步则是汇总统计并计算出相应的百分比形式表示的留存比率[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值