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

Kusto执行bag_unpack展开动态字段时如何对多列批量应用函数

可行实现方案

方案1:动态值预转换(推荐,性能最优)

不要等bag_unpack把动态字段拆成固定列之后再批量处理列值,直接在动态对象层面完成所有值的类型转换,再做拆包,全程不需要手动枚举任何键名:

  • 核心逻辑:遍历milestones动态对象下的所有键值对,对每个值应用时间转换函数,重新打包成结构一致的新动态对象,再调用bag_unpack展开,展开后的列直接就是转换完成的datetime类型。
  • 可直接运行的代码:
// 自定义时间转换函数,入参调整为long类型更适配数值型时间戳
let f = view(a:long) {
    unixtime_milliseconds_todatetime(a)
};
log_table
| take 1
// 遍历动态对象所有键值对,预转换值类型
| extend milestones = mv-apply(milestones on (
    summarize make_bag(bag_create(key, f(to_long(value))))
))
// 展开转换完成的动态字段
| evaluate bag_unpack(milestones, "m_")

运行后会自动生成m_ta、m_tb等所有对应键的列,值均为转换后的datetime类型,后续milestones新增多少个键都不需要修改查询逻辑。

方案2:长表中转转换(适配必须先拆列的场景)

如果业务逻辑必须先把动态字段拆成列,再做后续处理,可以通过「宽表转长表→批量转换值→长表转回宽表」的逻辑实现,不需要手动枚举列名,但性能比方案1差:

let f = view(a:long) {
    unixtime_milliseconds_todatetime(a)
};
log_table
| take 1
| evaluate bag_unpack(milestones, "m_")
// 生成唯一行标识用于后续宽表还原
| extend _row_id = new_guid()
// 将所有m_前缀的列转为键值对格式的长表
| narrow(pack_array("_row_id"), patterns = pack_array("m_*"))
// 对所有值统一应用转换函数
| extend value = f(to_long(Value))
// 透视回宽表格式
| evaluate pivot(Column, take_any(value), _row_id)
| project-away _row_id

说明:之前写的project f(m_*)无法执行,是因为KQL的project操作符不支持通配符批量匹配多列作为函数入参,没有直接对通配符匹配的列批量应用单参数函数的原生语法,因此优先选择在动态结构层完成转换的方案1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:33:39