我是靠谱客的博主 欢呼纸飞机,这篇文章主要介绍Spark——Spark/Hive SQL计算获取连续登陆N天及以上的用户问题实现方式,现在分享给大家,希望可以做个参考。

文章目录

  • 问题
  • 实现方式
    • 1. 实现SQL
    • 2. 实现步骤

问题

如何通过SQL获取每个月连续登陆超过5天的用户?

例如,某个用户3月的登录数据如下(一个用户在一天之内可能会登录多次):

user_idlogin_time
00012021-03-01 09:20:36
00012021-03-01 13:45:36
00012021-03-02 10:20:36
00012021-03-03 07:20:36
00012021-03-09 09:20:36
00012021-03-10 09:20:36
00012021-03-11 09:20:36
00012021-03-11 20:20:36
00012021-03-12 09:20:36
00012021-03-13 09:20:36
00012021-03-14 09:20:36
0001

实现方式

1. 实现SQL

先上实现SQL语句:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
select distinct month, user_id from ( select user_id, date_format(login_time, "yyyy-MM") month, row_number over(partition by user_id, new_login_time order by new_login_time asc) as rn_1 from ( select user_id, login_time, date_sub(login_time, rn) new_login_time from ( select user_id, login_time, row_number over(partition by user_id order by login_time asc) as rn from ( select distinct user_id, date_format(login_time, "yyyy-MM-dd") login_time from t ) t1 ) t2 ) t3 ) t4 where rn_1 >= 5

2. 实现步骤

  1. 由于一天之内同一个用户会登录多次,我们将login_time格式化成时分秒(yyyy-MM-dd)的格式,并对整个数据进行去重,输出数据如下:
user_idlogin_time
00012021-03-01
00012021-03-02
00012021-03-03
00012021-03-09
00012021-03-10
00012021-03-11
00012021-03-12
00012021-03-13
00012021-03-14
0001
  1. 使用窗口函数对步骤1输出的数据进行组内排序,SQL如下:
复制代码
1
2
3
//rn为行号标记 row_number over(partition by user_id order by login_time asc) as rn

排序之后的数据如下:

user_idlogin_timern
00012021-03-011
00012021-03-022
00012021-03-033
00012021-03-094
00012021-03-105
00012021-03-116
00012021-03-127
00012021-03-138
00012021-03-149
0001
  1. 我们将login_time列减去rn列,输出以下数据:
user_idlogin_timenew_login_time
00012021-03-012021-02-28
00012021-03-022021-02-28
00012021-03-032021-02-28
00012021-03-092021-03-05
00012021-03-102021-03-05
00012021-03-112021-03-05
00012021-03-122021-03-05
00012021-03-132021-03-05
00012021-03-142021-03-05
0001
  1. 对步骤3输出的数据进行组内排序,SQL如下:
复制代码
1
2
3
//rn_1为行号标记 row_number over(partition by user_id, new_login_time order by new_login_time asc) as rn_1

排序之后输出数据如下:

user_idlogin_timenew_login_timern_1
00012021-03-012021-02-281
00012021-03-022021-02-282
00012021-03-032021-02-283
00012021-03-092021-03-051
00012021-03-102021-03-052
00012021-03-112021-03-053
00012021-03-122021-03-054
00012021-03-132021-03-055
00012021-03-142021-03-056
0001

这一步其实也可以通过group by分组求和,取大于等于5的记录。

  1. 过滤出那些rn_1大于等于5的记录,并对user_id进行去重,就能得出每月连续登陆大于等于5天的用户了。

最后

以上就是欢呼纸飞机最近收集整理的关于Spark——Spark/Hive SQL计算获取连续登陆N天及以上的用户问题实现方式的全部内容,更多相关Spark——Spark/Hive内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部