hive、sparksql统计每小时的在线人数、访问时长、平均访问时长

一、业务场景描述

vpn的访问日志有三个字段,用户名、时间、状态,

如 张三、‘2020-04-28 10:00:00'、’login',即张三这个用户10点登陆了vpn

如 张三、‘2020-04-28 11:10:00'、’login',即张三这个用户11:10退出了vpn

现在有一天的访问vpn的日志,如果某个用户第一条就是logout,就默认该用户的今天的第一次登录为0点,如果某个用户的最后一条日志状态是login,说法默认该用户的今天的最后一欠退出vpn的时间为23:59,如下为4-28当天的vpn访问日志记录

'aa','2020-04-28 09:30:00','login'
'aa','2020-04-28 10:15:00','logout'
'aa','2020-04-28 13:30:00','login'
'aa','2020-04-28 14:15:00','logout'
'bb','2020-04-28 06:30:00','login'
'bb','2020-04-28 09:15:00','logout'
'bb','2020-04-28 12:30:00','login'
'cc','2020-04-28 11:25:00','logout'
'cc','2020-04-28 16:30:00','login'
'cc','2020-04-28 20:10:00','logout'
'dd','2020-04-28 05:25:00','logout'
'dd','2020-04-28 10:30:00','login'
'dd','2020-04-28 11:10:00','logout'
'dd','2020-04-28 21:15:00','login'

二、统计vpn每个小时的在线人数

先查出每个用户的每次的登录、退出时间并放在一条数据上

select name,
case when stat='logout' then logout_ts else login_ts end as login_ts,
case when stat='logout' then login_ts else logout_ts end as logout_ts
from 
(
select name,ts as login_ts,xx as logout_ts,rn,stat from
(
select name,ts,stat,
-- 按用户名分组,lead窗口函数取下一条的时间
case when stat='login'
	then lead(ts,1,'2020-04-28 23:59:59') over(partition by name order by ts)
	else '2020-04-28 00:00:00' end as xx,
ROW_NUMBER() OVER( PARTITION BY name ORDER BY ts asc) rn
from test20200428) tt where stat='login' or (stat='logout' and rn=1)
) ttt

处理的结果如下

接下来的处理可以基于上表来进行相应的处理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章