Azure Log Analytics中Kusto合并多行并按条件过滤的实现问题
解决方案
1. 修正合并行的Kusto查询
你之前用的any()函数会随机选取值,大概率拿到空值,所以导致trackedproperty2为空。可以用take_any_non_empty()替代(优先选取非空值),或者用max()(每个uniqueID对应属性只有一个非空值,max会直接取到该值),两种方式都能解决问题:
方法一:聚合函数直接取非空值
table | summarize trackedproperty1 = take_any_non_empty(trackedproperty1), trackedproperty2 = take_any_non_empty(trackedproperty2) by uniqueID | where toint(trackedproperty1) >= 25
方法二:自连接(和SQL思路对齐)
如果更习惯SQL的自连接写法,也可以拆分数据集后再关联:
// 提取trackedproperty1非空的行 let prop1_set = table | where isnotempty(trackedproperty1); // 提取trackedproperty2非空的行 let prop2_set = table | where isnotempty(trackedproperty2); // 按uniqueID做内连接 prop1_set | join kind=inner prop2_set on uniqueID | project uniqueID, trackedproperty1, trackedproperty2 | where toint(trackedproperty1) >= 25
2. 扩展:展开JSON格式的trackedproperty2
如果trackedproperty2是JSON字符串,先通过parse_json()转成动态对象,再根据JSON结构选择展开方式:
情况1:JSON为对象(如{"name":"test", "value":"123"})
用bag_unpack()直接展开为列:
table | summarize trackedproperty1 = take_any_non_empty(trackedproperty1), trackedproperty2 = take_any_non_empty(trackedproperty2) by uniqueID | where toint(trackedproperty1) >= 25 | extend json_obj = parse_json(trackedproperty2) | evaluate bag_unpack(json_obj)
情况2:JSON为数组(如[{"item":"a"}, {"item":"b"}])
用mv-expand先展开数组元素,再拆分为列:
table | summarize trackedproperty1 = take_any_non_empty(trackedproperty1), trackedproperty2 = take_any_non_empty(trackedproperty2) by uniqueID | where toint(trackedproperty1) >= 25 | extend json_array = parse_json(trackedproperty2) | mv-expand json_array | evaluate bag_unpack(json_array)
注意:如果trackedproperty1存储为字符串类型,必须用toint()转换为数字后再做数值比较,避免类型错误。
内容的提问来源于stack exchange,提问作者TheDemonLord
相关产品推荐
相关产品推荐

