Kusto中SCAN运算符如何处理可选列?如何查找含偶发值的序列?
使用Kusto SCAN运算符捕获含偶发值的序列
可以通过调整SCAN的状态转移逻辑,实现捕获所有从A到C的序列(无论中间是否出现B)。以下是具体实现和原理说明:
解决方案代码
let Events = datatable (ts: datetime, Event: string) [ datetime("2022-12-01"), "A", // 启动事件 datetime("2022-12-02"), "B", // 偶发错误 datetime("2022-12-03"), "C", // 结束事件 datetime("2022-12-04"), "A", // 无错误的启动序列 datetime("2022-12-05"), "C", datetime("2022-12-06"), "A", // 含无关事件的序列 datetime("2022-12-07"), "D", datetime("2022-12-08"), "C" ] ; Events | sort by ts asc | scan declare (in_sequence: bool = false, has_error: bool = false) with ( // 匹配到A,标记进入序列,重置错误状态 step start: not in_sequence and Event == "A" => in_sequence = true, has_error = false; // 序列中匹配到B,标记错误存在 step error: in_sequence and Event == "B" => has_error = true; // 序列中匹配到C,完成序列,输出后重置状态 step end: in_sequence and Event == "C" => in_sequence = false, has_error = has_error; // 跳过序列中的无关事件,保持当前状态 step skip: in_sequence and Event !in ("B", "C") => in_sequence = true, has_error = has_error; ) | where not in_sequence // 仅保留已完成的A→C序列 | project 启动时间 = prev(ts), 启动事件 = prev(Event), 是否出现错误 = has_error, 结束时间 = ts, 结束事件 = Event
SCAN处理可选步骤的原理
SCAN本质是基于状态机的序列匹配工具,要实现可选元素的支持,核心是打破“必须按固定步骤顺序匹配”的限制,通过自定义状态变量跟踪序列进展:
- 用
declare定义状态变量(如in_sequence标记是否处于A之后的序列中,has_error标记是否出现过B),灵活控制状态转移。 - 允许从“匹配A”的状态直接转移到“匹配C”的状态,同时保留经过B的路径,实现B的可选性。
- 新增跳过无关事件的步骤,确保序列中间的非目标事件不会中断匹配逻辑。
原代码的问题在于强制要求按A→B→C的固定顺序匹配,只有三个事件全部存在时才会触发匹配;调整后的逻辑通过状态变量和多分支转移条件,覆盖了所有包含A和C的序列场景。
内容的提问来源于stack exchange,提问作者Werner
相关产品推荐
相关产品推荐

