会话化是什么
会话化把同一用户的相邻行为按静默时长切成一段段访问。阈值通常取 30 分钟,但真正的口径由业务定:内容型产品常用 30 分钟,交易型可能缩到 15 分钟。实现路径固定三步——先用窗口函数求相邻事件的间隔,标记出切分点,再累计求和得到会话序号,最后按会话聚合出时长、页数、入口页等度量。
基本信息
| 超时阈值 | 常见 30 分钟,按业务与产品定 |
|---|---|
| 切分实现 | lag 求间隔,累计和生成会话号 |
| 分区依据 | 按用户分区,按事件时间排序 |
| 产出度量 | 会话时长、页数、入口页、出口页 |
| 跨天处理 | 会话不被自然日切断 |
典型使用场景
- 流量质量分析:会话数、会话时长比页面浏览更贴近真实访问
- 转化漏斗:以会话为样本看从入口到下单的路径
- 内容推荐:同一会话内的兴趣迁移比跨会话更可靠
- 广告效果评估:落地页跳出率按会话口径计算
- 客服工单归并:把同一用户短时间内的多次咨询并成一件事
会话切分
会话切分
WITH e AS (
SELECT user_id, event_ts,
lag(event_ts) OVER (PARTITION BY user_id ORDER BY event_ts) AS prev_ts
FROM dwd_event
), s AS (
SELECT user_id, event_ts,
sum(CASE WHEN prev_ts IS NULL
OR unix_timestamp(event_ts) - unix_timestamp(prev_ts) >= 1800
THEN 1 ELSE 0 END)
OVER (PARTITION BY user_id ORDER BY event_ts) AS session_seq
FROM e
)
SELECT user_id, session_seq, min(event_ts) AS start_ts, max(event_ts) AS end_ts
FROM s GROUP BY user_id, session_seq;输出逐列读法
| 列 | 含义 | 异常表现 |
|---|---|---|
| prev_ts | 同一用户上一条事件时间 | 首条为空的处理漏写会丢一个会话 |
| session_seq | 会话序号,从 1 递增 | 每次重跑序号变化说明排序不稳定 |
| start_ts | 会话起点 | 与结束时间相同说明只有一条事件 |
| end_ts | 会话终点 | 跨天会话被日期切断,指标双算 |
超时阈值是口径而不是实现细节:阈值从 30 分钟改成 15 分钟,会话数与人均会话时长都会变,同比数据不可比。阈值应作为参数写进会话表的分区或版本列,变更时保留旧版本结果。
同一用户事件量极大时按用户分区排序会形成热点。可行做法是先在近实时层按用户加小时预聚合,再在离线按完整时间范围重算边界——跨小时的相邻事件要用前一小时的末条事件补齐 prev_ts。