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&#
### 使用 Hive SQL 统计用户在线时长 为了统计用户在线时长,可以通过计算每次会话的持续时间并汇总这些时间段来实现。下面提供了一个具体的例子,展示了如何利用Hive SQL完成这一任务。 #### 方法一:基于登录事件的时间差 对于记录有明确开始时间和结束时间的情况,可以直接相减得到单次访问时长,并进一步聚合获得总的在线时长: ```sql -- avg_single_duration表示平均每天每位用户的单次登录时长; -- avg_user_duration则反映了平均每名活跃用户一天内的累计在线时长。 SELECT start_time_str, SUM(duration)/COUNT(*)/1000 AS avg_single_duration, SUM(duration)/COUNT(DISTINCT userid)/1000 AS avg_user_duration FROM ( SELECT *, end_time - start_time AS duration FROM t1 WHERE start_type = '1' AND end_type = '2' ) t2 WHERE duration <= 7200000 -- 过滤掉异常过长的会话 GROUP BY start_time_str ORDER BY start_time_str; ``` 此查询首先筛选出符合条件的日志条目(即`start_type='1'`和`end_type='2'`),接着计算每一条日志对应的会话长度,再按照日期分组并对各组内所有会话做加权平均运算得出最终结果[^1]。 #### 方法二:通过状态变化标记法 当仅有上线或离线时刻而无具体配对关系时,则可采用另一种策略——使用标志位(`flag`)区分上下线动作,并借助窗口函数追踪当前处于活动状态的人数变动情况: ```sql WITH online_events AS( SELECT user_id, event_time as dt, CASE WHEN action='login' THEN 1 ELSE -1 END as flag FROM login_logout_logs ), cumulative_counts AS( SELECT user_id, dt, SUM(flag) OVER (PARTITION BY user_id ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as cumulative_sum FROM online_events ) SELECT MAX(cumulative_sum) as peak_concurrent_users FROM cumulative_counts; ``` 上述代码片段定义了两个CTE(Common Table Expressions): `online_events`用于转换原始数据集中的行为编码;`cumulative_counts`负责累积计算每个用户的并发连接数目直至达到峰值为止[^2].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值