如何用KQL从JSON对象数组提取指定key的value并设置默认值
高效提取JSON数组中指定Key对应的Value(Kusto查询)
针对百万级行数据的性能需求,推荐使用array_to_bag矢量函数实现,避免行级遍历的性能损耗:
解决方案查询语句
datatable(d:dynamic) [ dynamic({ "Details":[ {"value":"Dave","key":"Name"}, {"value":"Male","key":"Gender"}, {"value":"30","key":"Age"} ] }), dynamic({ "Details":[ {"value":"Dan","key":"Name"}, {"value":"40","key":"Age"} ] }), ] | extend details_bag = array_to_bag(d.Details, "key", "value") | extend Gender = coalesce(details_bag["Gender"], "Undefined") | project Gender
逻辑说明
array_to_bag转换数组为键值对字典:
这个函数是Kusto的矢量操作函数,直接对整个JSON数组批量转换,将[{"key":"X","value":"Y"}, ...]结构的数组转换成键值对形式的bag(类似字典),性能远高于行级展开的mv-apply/mv-extend,适合百万级大表场景。
参数依次为:目标数组列、作为键的字段名、作为值的字段名。coalesce设置默认值:
直接通过bag索引details_bag["Gender"]获取对应值,若该key不存在则返回null,coalesce会取第一个非空值,即返回预设的"Undefined"。
输出结果
Gender ------ Male Undefined
额外注意
如果数组中存在重复的key,array_to_bag会保留最后一个出现的value,符合常规提取需求;若需处理重复key的特殊场景,可结合mv-apply做前置去重,但针对当前需求,array_to_bag是性能最优的选择。
内容的提问来源于stack exchange,提问作者Storage4852
相关产品推荐
相关产品推荐

