如何让KQL的bag_unpack函数输出单行而非多行(无需显式聚合)
解决方法
要实现将每个安全警报(SecurityAlert)的实体信息输出为单行,同时无需显式指定列名,可以通过mv-apply配合动态列汇总来完成,替代原查询中先mv-expand再bag_unpack的方式。具体查询语句如下:
SecurityAlert | where TimeGenerated > ago(1d) | extend Entities = parse_json(Entities) | mv-apply Entity = Entities on ( evaluate bag_unpack(Entity, OutputColumnPrefix='Entities_') | summarize across (column_names() where column startswith "Entities_") by SystemAlertId: toscalar(SystemAlertId) )
核心步骤:
- 解析Entities字段:先将
Entities字段解析为动态数组,确保后续能正确遍历每个实体对象。 - 遍历并拆包实体:用
mv-apply逐个处理数组中的每个实体(Entity),通过bag_unpack将实体的键值对展开为带前缀的列(比如Entities_AccountName)。 - 动态汇总为单行:利用
summarize across语法,自动收集所有以Entities_开头的列的所有值为数组,按警报唯一标识SystemAlertId分组,最终每个原始警报对应一行结果,每个实体属性列以数组形式包含该警报下所有实体的对应值。
这种方式无需提前预知实体的列名,完全动态处理所有可能的实体属性,同时保证每个警报的结果在单行展示。
内容的提问来源于stack exchange,提问作者HarriS
相关产品推荐
相关产品推荐

