无会话ID仅含会话开始事件时如何在Kusto中重建会话
Kusto 无会话结束事件的会话标记实现方案
核心逻辑
不需要复刻SQL的last_value()空值填充逻辑,直接用Kusto内置的分区累计求和算子即可实现需求,逻辑如下:
- 按玩家ID分区,对所有事件按时间戳升序排序
- 标记每一行是否为
client_session_start会话开始事件,是则标记为1,其余事件标记为0 - 对每个玩家分区内的标记值做累计求和,累计值即为该玩家维度下的会话序号
- 拼接玩家ID与会话序号,即可得到全局唯一的会话ID:两次相邻会话开始之间的所有事件、最后一次会话开始后的所有事件,都会自动关联到最近一次会话开始对应的ID,完全覆盖需求场景
可直接运行的示例代码
// 替换为自己的实际业务表名即可 let raw_data = datatable(ID_player:string, Timestamp:datetime, event_name:string) [ "aaa", datetime(2024-01-01 12:00:00), "client_session_start", "aaa", datetime(2024-01-01 12:10:00), "game_operation", "aaa", datetime(2024-01-01 12:20:00), "item_buy", "aaa", datetime(2024-01-01 12:30:00), "client_session_start", "aaa", datetime(2024-01-01 12:40:00), "battle_settle", "aaa", datetime(2024-01-01 12:50:00), "app_background", "bbb", datetime(2024-01-01 11:00:00), "client_session_start", "bbb", datetime(2024-01-01 11:15:00), "daily_reward_claim" ]; raw_data | order by ID_player asc, Timestamp asc // 标记会话开始事件 | extend is_session_start = iff(event_name == "client_session_start", 1, 0) // 分玩家累计求和生成会话序号,切换玩家时自动重置计数 | extend session_seq = row_cumsum(is_session_start, ID_player != prev(ID_player)) // 生成自定义格式的会话ID | extend session_id = strcat(ID_player, "_s", session_seq) // 可按需保留/删除字段 | project-away is_session_start, session_seq
关键算子说明
row_cumsum:Kusto原生累计求和算子,第二个参数为计数重置条件,此处判断当前行和上一行玩家ID不一致时,自动将累计值清零重新计算,天然适配分用户统计的场景- 如果需要在会话ID中携带会话开始时间、自定义哈希等信息,只需在生成
session_id的步骤调整拼接规则即可,不需要改动核心分组逻辑
注意事项
如果存在玩家维度下第一条事件不是
client_session_start的异常数据,这部分数据的会话序号会是0,可根据业务规则直接过滤,或单独标记为未知会话。
内容的提问来源于stack exchange,提问作者ianux22
相关产品推荐
相关产品推荐

