You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:24:00