Kusto使用parse和mv-expand后如何投射额外列并拆分字符串字段
Kusto查询实现方案
以下是直接可运行的完整查询代码:
// 模拟示例数据,替换为自己的表即可直接使用 datatable(column1:string, column2:string) [ "测试行1", @"for each user:[{""id"":1, ""Publisher"":null, ""type"":0, ""Identity"":{ ""Id"":""00000000-0000-0000-0000-000000000000"", ""sid"":""134567890""}, ""roles"":[], ""permissions"":[], ""name"":""ABC""}, {""id"":2, ""Publisher"":null, ""type"":1, ""Identity"":{ ""Id"":""00000000-0000-0000-0000-000000000001"", ""sid"":""134567891""}, ""roles"":[""admin""], ""permissions"":[""read"",""write""], ""name"":""DEF""}]", ] // 提取去掉前缀后的JSON数组字符串 | parse column2 with "for each user:" user_array_str // 将字符串转为Kusto可解析的动态类型 | extend user_array = dynamic(user_array_str) // 展开数组,每个用户对象对应独立行,column1自动保留 | mv-expand user = user_array // 投射所需的所有字段 | project column1, id = tolong(user.id), Publisher = user.Publisher, type = toint(user.type), Identity_Id = user.Identity.Id, Identity_sid = user.Identity.sid, roles = user.roles, permissions = user.permissions, name = user.name
步骤说明
parse算子直接匹配固定前缀for each user:,自动提取后续的JSON数组内容,无需额外做字符串裁剪- 转换为动态类型后才能解析JSON的嵌套结构,
mv-expand展开数组时原始的column1字段会自动关联到每一行拆分后的数据,不需要额外处理 - 投射字段时直接用
.访问嵌套层级的键值即可,可根据业务需求对字段做类型转换,比如数字类字段用tolong()/toint()转换避免后续计算报错
注意事项
- 如果存在
column2不满足前缀格式的脏数据,可在parse步骤后添加| where isnotempty(user_array_str)过滤无效行 - 若数组元素存在缺字段的情况,可用
coalesce(user.xxx, 默认值)为缺失字段设置默认值
内容的提问来源于stack exchange,提问作者Swasti
相关产品推荐
相关产品推荐

