使用make_list聚合时如何避免数组扁平化生成嵌套数组?
问题:在Kusto中按分组生成嵌套数组([X,Y]元组的列表)
现有包含数值列A、X、Y的表,需按A的每个值生成由(X,Y)元组组成的嵌套数组,预期结果如下:
| A | Points |
|---|---|
| 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会将数组扁平化(未找到相关文档说明),得到如下结果:
| A | Points |
|---|---|
| 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
执行后得到符合预期的结果:
| A | Points |
|---|---|
| 1 | [[1,3],[2,3]] |
| 2 | [[3,1],[1,2]] |
这种写法无需额外的字符串拼接与解析,性能更优且代码简洁。
内容的提问来源于stack exchange,提问作者Philippe Signoret
相关产品推荐
相关产品推荐

