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

如何在KQL中实现毫秒粒度的时间窗口关联?

解决方案:使用Kusto的Asof Join实现高效时序匹配

针对你需要将eventLog中的每个事件关联到processStartLog中最近的前置进程启动记录的场景,可以使用Kusto的asof join运算符,它专门为这种时序匹配场景设计,无需生成大量中间行,效率远高于普通时间窗口连接。

实现代码

首先是你的示例数据表:

let processStartLog = datatable(startTime:datetime, processName:string)
[
    datetime('2024-08-15T01:41:23.034Z'),'D',
    datetime('2024-08-13T08:22:51.688Z'),'C',
    datetime('2024-08-12T10:48:40.124Z'),'B',
    datetime('2024-08-10T00:00:12.526Z'),'A',
];
let eventLog = datatable(timestamp:datetime, eventName:string)
[
    datetime('2024-08-14T09:30:19.136Z'),'foo', // occurs during processName 'C'
    datetime('2024-08-13T12:23:01.976Z'),'bar', // occurs during processName 'C'
    datetime('2024-08-10T01:11:41.124Z'),'xyz', // occurs during processName 'A'
];

使用asof join的查询:

eventLog
| asof kind=leftouter join processStartLog on $left.timestamp >= $right.startTime
| project timestamp, eventName, processName

输出结果

执行上述查询后,将得到你期望的结果:

| timestamp                  | eventName | processName |
|----------------------------|-----------|-------------|
| 2024-08-14T09:30:19.136Z  | foo       | C           |
| 2024-08-13T12:23:01.976Z  | bar       | C           |
| 2024-08-10T01:11:41.124Z  | xyz       | A           |

原理说明

  • Asof join会为eventLog中的每一行,找到processStartLog中时间戳小于等于当前事件时间戳的最新记录,无需生成所有可能的时间窗口匹配对,因此即使在大数据量、长时间跨度的场景下也能高效运行。
  • 如果需要针对特定维度(如机器ID、进程组)进行匹配,可以在join条件中添加额外的等值键,例如:
    eventLog
    | asof kind=leftouter join processStartLog on machineId, $left.timestamp >= $right.startTime
    
    这样可以确保只匹配同一机器下的进程启动记录,避免跨维度的错误关联。

内容的提问来源于stack exchange,提问作者Agendum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:05:12