sql计算留存_Hive 计算用户留存率

Hive 计算用户留存率
SQL数据分析 1周前
统计用户留存率,一次统计多个模块,多个日期的留存率;
之前用:SQL-用户月留存率 通过left join 不等式判定;
但是 hive 不支持 在 left join 中 不等式判定
so 通过另外一种方式实现 用户留存率:
代码如下:
with da_user as (
select
from_unixtime(unix_timestamp(ds,'yyyyMMdd'),'yyyy-MM-dd') as ds
,user_id
,regexp_extract(args,'project_id=(d+)',1) as project_id
from ods_view_ypp.ods_all_mobile_log log
where ds between '20190523' and '20190621'
and app_id = 100
and regexp_extract(args,'project_id=(d+)',1) = 1034
group by
from_unixtime(unix_timestamp(ds,'yyyyMMdd'),'yyyy-MM-dd')
,user_id
,regexp_extract(args,'project_id=(d+)',1)
)
select ds
,total_cnt
,concat_ws('% | ', cast(round(diff_1cnt*100/total_cnt, 2) as string), cast(diff_1cnt as string)) a
,concat_ws('% | ', cast(round(diff_2cnt*100/total_cnt, 2) as string), cast(diff_2cnt as string)) b
,concat_ws('% | ', cast(round(diff_3cnt*100/total_cnt, 2) as string), cast(diff_3cnt as string)) c
,concat_ws('% | ', cast(round(diff_4cnt*100/total_cnt, 2) as string), cast(diff_4cnt as string)) d
from(
select
t1.ds
,count(distinct t1.user_id) as total_cnt
,count(distinct if(datediff(t2.ds,t1.ds)=1,t1.user_id,null)) as diff_1cnt
,count(distinct if(datediff(t2.ds,t1.ds)=2,t1.user_id,null)) as diff_2cnt
,count(distinct if(datediff(t2.ds,t1.ds)=3,t1.user_id,null)) as diff_3cnt
,count(distinct if(datediff(t2.ds,t1.ds)=4,t1.user_id,null)) as diff_4cnt
from da_user t1
left join da_user t2
on (t1.user_id = t2.user_id )
group by t1.ds
)t
结果如下图所示:

1c29c36d7ecc25b2bccdac243cdb716c.png


参考地址:
[hive 关于用户留存率的计算 - chenpe32cp的博客 - CSDN博客](https://blog.csdn.net/chenpe32cp/article/details/85068184)
[【hive】关于用户留存率的计算 - zzhangyuhang - 博客园](https://www.cnblogs.com/zzhangyuhang/p/9884967.html)

留存率是指在一定时间范围内,用户在某个时间点后仍然使用产品或服务的比例。计算留存率可以使用Hive SQL或Spark SQL。 假设我们要计算某个应用程序在第一天、第七天和第三十天的留存率。我们可以按照以下步骤进行计算: 1. 首先,我们需要从用户行为日志中提取出每个用户的第一次使用时间。假设我们已经将这些数据存储在一个名为user_first_use的Hive表中,其中包含用户ID和第一次使用时间。 2. 接下来,我们需要计算每个用户在第一天、第七天和第三十天后是否仍然使用了应用程序。假设我们已经将这些数据存储在一个名为user_activity的Hive表中,其中包含用户ID、活动日期和活动类型(例如,打开应用程序、浏览页面等)。 3. 然后,我们可以使用Hive或Spark SQL编写查询来计算留存率。以下是一个使用Hive SQL计算留存率的示例查询: ``` SELECT COUNT(DISTINCT ua.user_id) AS total_users, COUNT(DISTINCT CASE WHEN DATEDIFF(ua.activity_date, uf.first_use_date) = 0 THEN ua.user_id END) AS day1_retention, COUNT(DISTINCT CASE WHEN DATEDIFF(ua.activity_date, uf.first_use_date) = 6 THEN ua.user_id END) AS day7_retention, COUNT(DISTINCT CASE WHEN DATEDIFF(ua.activity_date, uf.first_use_date) = 29 THEN ua.user_id END) AS day30_retention FROM user_first_use uf JOIN user_activity ua ON uf.user_id = ua.user_id WHERE ua.activity_date BETWEEN uf.first_use_date AND DATE_ADD(uf.first_use_date, 29) ``` 这个查询将返回四个值:总用户数、第一天留存率、第七天留存率和第三十天留存率。我们使用COUNT(DISTINCT)函数来计算唯一用户的数量,并使用CASE语句来计算在特定日期范围内仍然使用应用程序的用户数量。DATEDIFF函数用于计算用户第一次使用应用程序后的天数。 4. 如果使用Spark SQL,可以使用类似的查询来计算留存率。以下是一个使用Spark SQL计算留存率的示例查询: ``` SELECT COUNT(DISTINCT ua.user_id) AS total_users, COUNT(DISTINCT CASE WHEN DATEDIFF(ua.activity_date, uf.first_use_date) = 0 THEN ua.user_id END) AS day1_retention, COUNT(DISTINCT CASE WHEN DATEDIFF(ua.activity_date, uf.first_use_date) = 6 THEN ua.user_id END) AS day7_retention, COUNT(DISTINCT CASE WHEN DATEDIFF(ua.activity_date, uf.first_use_date) = 29 THEN ua.user_id END) AS day30_retention FROM user_first_use uf JOIN user_activity ua ON uf.user_id = ua.user_id WHERE ua.activity_date BETWEEN uf.first_use_date AND DATE_ADD(uf.first_use_date, 29) ``` 这个查询与Hive SQL查询非常相似,只是使用了Spark SQL的语法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值