KQL:将含无键嵌套JSON数组的日志转换为指定表格结构
解决方案(基于Kusto Query Language)
你遇到的核心问题是原JSON中的分类为动态键,直接使用parse_json()+mv-expand会将这些键解析为列名,而非列值。可以通过bag_to_rows()函数先把动态键值对转换为行结构,再展开商品数组,具体实现如下:
完整查询示例
假设你的日志表名为AppLogs,执行以下KQL查询:
AppLogs | extend LogEntryParsed = parse_json(LogEntry) // 将JSON动态键值对转为行:Category存分类标识,Items存对应商品数组 | evaluate bag_to_rows(LogEntryParsed, Category, Items) // 展开每个分类下的商品数组,每行对应单个商品 | mv-expand Items // 提取商品的各个字段 | extend item_description = Items.item_description, item_price = Items.item_price, sku = Items.sku // 保留目标列,移除临时中间列 | project Category, item_description, item_price, sku
步骤说明
- 解析JSON字符串:
parse_json(LogEntry)将字符串格式的日志内容转换为可操作的动态对象LogEntryParsed。 - 动态键转列值:
evaluate bag_to_rows(...)是核心操作,它会把LogEntryParsed中的每个分类键(如category1/sub_category)作为Category列的值,对应的商品数组存入Items列,彻底解决动态键无法作为列值的问题。 - 展开商品数组:
mv-expand Items将每个分类下的商品数组拆分为独立行,每行对应一个商品条目。 - 提取商品字段:通过
.操作符从Items对象中直接提取item_description、item_price、sku字段。 - 整理输出列:
project语句保留需要的目标列,剔除过程中生成的临时列。
预期输出结果
针对你提供的日志内容,执行查询后会得到如下表格:
| Category | item_description | item_price | sku |
|---|---|---|---|
| category1/sub_category | item1 | 1.2 | 12 |
| category2/sub_category | item2 | 5.0 | 123 |
| category2/sub_category | item3 | 5.0 | 1234 |
内容的提问来源于stack exchange,提问作者Janie Zhan
相关产品推荐
相关产品推荐

