You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用make_list聚合时如何避免数组扁平化生成嵌套数组?

问题:在Kusto中按分组生成嵌套数组([X,Y]元组的列表)

现有包含数值列A、X、Y的表,需按A的每个值生成由(X,Y)元组组成的嵌套数组,预期结果如下:

APoints
1[[1,3],[2,3],...]
2[[3,1],[1,2],...]

...

尝试执行以下查询:

datatable(A:int, X:int, Y:int) [
    1, 1, 3,
    1, 2, 3,
    2, 3, 1,
    2, 1, 2
]
| summarize Points = make_list(pack_array(X, Y)) by A

但发现make_list会将数组扁平化(未找到相关文档说明),得到如下结果:

APoints
1[1,3,2,3]
2[3,1,1,2]

现有几种替代方案,但均不尽如人意:

  • 将列打包为dictionary而非array:
    | summarize Points = make_list(bag_pack_columns(X, Y)) by A
    
    结果:
    [{"X":1,"Y":3},{"X":2,"Y":3}]
    
  • 将array放入仅含一个键的dictionary:
    | summarize Points = make_list(bag_pack("P", pack_array(X, Y))) by A
    
    结果:
    [{"P":[1,3]},{"P":[2,3]}]
    
  • 聚合前将每个打包数组转为string:
    | summarize Points = make_list(tostring(pack_array(X, Y))) by A
    
    结果:
    ["[1,3]","[2,3]"]
    
  • 聚合前将元组编码为非JSON字符串:
    | summarize Points = make_list(strcat(X, ",", Y)) by A
    
    结果:
    ["1,3","2,3"]
    

目前仅能通过构造JSON字符串再解析的方式得到预期嵌套数组,但该方法较为繁琐:

| summarize Points = parse_json(strcat('[', strcat_array(make_list(tostring(pack_array(X, Y))), ","), ']')) by A

是否存在更优的实现方式?(注:现有替代方案均可满足需求,此问题仅出于好奇)


更优解决方案

可以直接使用dynamic类型构造每个[X,Y]元组,再通过make_list聚合,避免数组扁平化问题:

datatable(A:int, X:int, Y:int) [
    1, 1, 3,
    1, 2, 3,
    2, 3, 1,
    2, 1, 2
]
| summarize Points = make_list(dynamic([X, Y])) by A

执行后得到符合预期的结果:

APoints
1[[1,3],[2,3]]
2[[3,1],[1,2]]

这种写法无需额外的字符串拼接与解析,性能更优且代码简洁。


内容的提问来源于stack exchange,提问作者Philippe Signoret

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:45:08