如何在KQL中将数组多值提取至不同行并生成对应DateTimeKey?
解决方案
可以通过结合mv-apply、range和数组索引实现一次性展开所有数据点并生成对应时间键,以下是完整的Kusto查询:
datatable(T:dynamic) [ dynamic ( { "name": "Temperature", "startTimestamp": "2022-12-14T08:00:00.0000000Z", "signals": [ { "name": "Temperature_inside", "values": [ "17.1", "17.5", "17.8", "17.9" ] }, { "name": "Temperature_outside", "values": [ "1.3", "1.4", "1.4", "1.5" ] } ] } ) ] | extend start_time = todatetime(T.startTimestamp), signals = T.signals | mv-apply idx = range(0, array_length(signals[0].values)-1, 1) on ( summarize event_time = start_time + idx * 15m, temperature_bag = make_bag( bag_pack( tostring(signals[*].name), todouble(signals[*].values[idx]) ) ) ) | evaluate bag_unpack(temperature_bag) | extend DateTimeKey = format_datetime(event_time, 'yyyyMMddhhmmss') | project DateTimeKey, Temperature_inside, Temperature_outside
关键步骤说明:
- 解析起始时间:将字符串格式的
startTimestamp转换为datetime类型,方便后续时间计算,同时提取信号列表。 - 生成数据点索引:利用
range生成与values数组长度匹配的索引序列(0到3),通过mv-apply遍历每个索引。 - 计算对应时间与打包数据:对每个索引,计算该数据点的实际时间(起始时间 + 索引×15分钟),并将每个温度传感器的名称与对应索引的数值打包成bag。
- 展开与格式化:用
bag_unpack将bag展开为单独的列,再将计算出的时间格式化为需要的数值型DateTimeKey。 - 整理输出:调整列顺序,得到目标结果。
运行该查询后,就能直接得到期望的4行数据,无需多次执行查询。
内容的提问来源于stack exchange,提问作者EindbaasJohn
相关产品推荐
相关产品推荐

