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

處理的結果如下

接下來的處理可以基於上表來進行相應的處理

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