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

如何在KQL中使用可复用函数将单列解析为多列

KQL长文本解析逻辑复用解决方案

报错原因

你定义的parseEventData属于表函数,返回的是表结构,不能直接在project/extend运算符中作为标量值调用,因此触发Operator source expression should be table or column报错。

可复用解决方案

方案1:修改为标量动态函数调用

适合需要灵活控制解析后字段展示的场景,将解析结果封装为动态对象返回,可直接在管道中调用:

// 定义解析函数,返回动态类型标量
let parseEventData = (EventData:string){
    dynamic(pack(
        "resourceName", extract("resourceName=([^,]+)", 1, EventData),
        "totalSlices", tolong(extract("totalSlices=(\\d+)", 1, EventData)),
        "sliceNumber", tolong(extract("sliceNumber=(\\d+)", 1, EventData)),
        "lockTime", todatetime(extract("lockTime=([^,]+)", 1, EventData)),
        "releaseTime", todatetime(extract("releaseTime=([^,]+)", 1, EventData)),
        "previousLockTime", todatetime(extract("previousLockTime=([^)]+)", 1, EventData))
    ))
};

// 调用示例
Events
| where parameter == "blah"
| extend eventParsed = parseEventData(EventData)
// 自动展开动态对象的所有字段,无需逐个定义
| evaluate bag_unpack(eventParsed)
| project Computer, User, resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime

方案2:保留表函数结构,用invoke调用

适合需要完全封装解析逻辑、保留原有表所有字段的场景:

// 定义表函数,接收带EventData字段的表作为输入,追加解析后的字段
let parseEventData = (T:(EventData:string)){
    T
    | parse EventData with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *  
};

// 调用示例
Events
| where parameter == "blah"
| invoke parseEventData()
| project Computer, User, resourceName, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime

永久复用技巧

如果使用的是Azure Monitor、Microsoft Sentinel等支持保存函数的环境,可以将上述函数保存为工作区函数,后续所有查询无需重复定义,直接调用函数名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:45:04