Ruby实现平台JSON日志按用户分组生成符合间隔规则的会话数据
Ruby实现访问日志用户会话分组方案
核心逻辑
- 先定义10分钟对应的毫秒阈值:
10 * 60 * 1000 = 600000毫秒 - 读取输入JSON后按userId对所有事件分组
- 每个用户的事件按时间戳升序排序,解决输入乱序问题
- 遍历排序后的事件拆分会话:当前事件和当前会话最后一个事件的时间差超过10分钟则新建会话,否则加入当前会话
- 按要求格式化每个会话的字段:startTime取会话首事件时间、pages按顺序取所有url、duration单事件为0,多事件为尾事件减首事件时间差
完整实现代码
require 'json' # 10分钟对应的毫秒阈值 TEN_MINUTES_MS = 10 * 60 * 1000 # 读取并解析输入日志 input_data = JSON.parse(File.read('input.json')) all_events = input_data['events'] # 按用户ID分组事件 user_events_map = all_events.group_by { |event| event['userId'] } # 生成用户会话集合 sessions_by_user = user_events_map.each_with_object({}) do |(user_id, events), result| # 对当前用户的所有事件按时间戳升序排序 sorted_events = events.sort_by { |event| event['timestamp'] } # 拆分会话 user_sessions = [] sorted_events.each do |event| if user_sessions.empty? # 第一个事件直接初始化会话 user_sessions << [event] else current_session = user_sessions.last last_session_ts = current_session.last['timestamp'] if event['timestamp'] - last_session_ts <= TEN_MINUTES_MS # 间隔符合要求,加入当前会话 current_session << event else # 间隔超过10分钟,新建会话 user_sessions << [event] end end end # 格式化会话为要求的输出结构 result[user_id] = user_sessions.map do |session_events| start_ts = session_events.first['timestamp'] end_ts = session_events.last['timestamp'] { startTime: start_ts, pages: session_events.map { |e| e['url'] }, duration: session_events.size == 1 ? 0 : end_ts - start_ts } end end # 输出结果,如需写入文件替换下方puts为File.write即可 output = { sessionsByUser: sessions_by_user } puts JSON.pretty_generate(output)
使用说明
将输入的日志JSON文件保存为input.json,和脚本放在同一目录下运行即可得到符合格式要求的输出,如需将结果写入文件,将最后一行替换为:
File.write('output.json', JSON.pretty_generate(output))
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

