是否有类似extend的行添加方法?Kusto数据表优化问询
Kusto 优化添加汇总行的查询方案
原始数据集
let DataSource = datatable(Name:string, value1:real, value2:real) [ 'Section 1', 2211.47, 3564.05, 'Transfer 1', 3075.44, 3717.51, 'Transfer 2', 3460.66, 4194.16, 'Transfer 3', 4819.36, 482.02, 'Section 2', 1742.02, 11971.05 ];
需求说明
- 添加一行名称为
Transfer的数据 value1取所有名称包含Transfer的行的value1之和value2取所有名称包含Transfer的行的value2的平均值- 最终结果保留原始的非
Transfer N行,加上新增的汇总行
当前实现方案
以下方案可实现需求,但处理大型数据集时,全表union再过滤的操作会带来额外CPU和内存开销:
let DataSource = datatable(Name:string, value1:real, value2:real) [ 'Section 1', 2211.47, 3564.05, 'Transfer 1', 3075.44, 3717.51, 'Transfer 2', 3460.66, 4194.16, 'Transfer 3', 4819.36, 482.02, 'Section 2', 1742.02, 11971.05 ]; DataSource | as t1 | union (t1 | summarize Name = "Transfer", value1 = sum(value1), value2 = sum(value2)) | where Name !in ("Transfer 1", "Transfer 2", "Transfer 3")
优化方案
通过拆分数据处理分支,减少冗余扫描和计算,提升大数据量下的性能:
let DataSource = datatable(Name:string, value1:real, value2:real) [ 'Section 1', 2211.47, 3564.05, 'Transfer 1', 3075.44, 3717.51, 'Transfer 2', 3460.66, 4194.16, 'Transfer 3', 4819.36, 482.02, 'Section 2', 1742.02, 11971.05 ]; // 直接保留非Transfer开头的原始行 DataSource | where not(Name startswith "Transfer") // 合并仅针对Transfer行计算出的汇总结果 | union ( DataSource | where Name startswith "Transfer" | summarize Name = "Transfer", value1 = sum(value1), value2 = avg(value2) )
优化点说明
- 减少数据扫描量:仅对原始数据集扫描一次,拆分出两个处理分支,避免原方案中全表union的冗余操作
- 精准过滤:用
startswith(若命名规则为Transfer开头)或contains(若名称任意位置包含Transfer)精准定位需要汇总的行,减少不必要的计算 - 避免重复过滤:直接保留目标原始行,不需要先union再过滤掉
Transfer N行,节省内存开销
内容的提问来源于stack exchange,提问作者user1997
相关产品推荐
相关产品推荐

