关于Kusto SCAN运算符执行结果的疑问:i=1不匹配s2且n恒为1
range i from 1 to 3 step 1 | scan with_match_id=matchId declare (s: long, n: long=0) with ( step s1: true => s=1, n=s1.n + 1; step s2: true => s=2, n=s2.n + 1; )
执行结果:
| i | s | n | matchId |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 0 |
| 2 | 1 | 1 | 1 |
| 3 | 2 | 1 | 1 |
| 3 | 1 | 1 | 2 |
疑问1:为何第一行(i=1)没有被s2步骤匹配?
Kusto的scan是状态机模式,多步骤匹配按顺序执行:
- 初始状态下,优先尝试第一个步骤
s1,由于条件为true,第一行直接匹配s1,生成对应输出行的同时,将该匹配链(matchId=0)的状态推进到s1完成后的阶段。 - 同一输入行只会匹配第一个符合条件的步骤,不会回溯尝试后续步骤。只有当处理下一行时,已推进的状态才会尝试执行下一个步骤
s2。
疑问2:为何字段n的值始终为1?
问题出在状态变量的引用方式:
- 你写的
s1.n和s2.n,引用的是对应步骤的初始默认值(也就是declare时设置的0),而非当前匹配链中已经更新后的n值。 - 所以每次计算都是
0 + 1 = 1,导致n始终为1。 - 若要实现累计计数,直接引用变量本身即可,修改后的查询如下:
range i from 1 to 3 step 1 | scan with_match_id=matchId declare (s: long, n: long=0) with ( step s1: true => s=1, n = n + 1; step s2: true => s=2, n = n + 1; )
执行后matchId=0的两行n会依次变为1和2,符合累计预期。
内容的提问来源于stack exchange,提问作者mananana
相关产品推荐
相关产品推荐

