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

Azure Data Explorer中Kusto实现树形构建与动态递归查询

Kusto 可完全实现自动递归层级遍历,无需手动逐层编写重复关联逻辑

核心实现原理

你当前的场景本质是有向图的广度优先遍历:

  • 图的顶点为所有唯一的Name节点
  • 边的关联规则为:输出节点(IngestType == 'output')的File字段,与输入节点(IngestType == 'input')的File字段相等时,存在一条从输出节点指向输入节点的有向边
  • 从指定起始节点出发沿边持续遍历,直到达到最大深度或无后续关联节点即可,你完全不需要为每一层单独编写重复的join逻辑,只要指定好最大深度,引擎会自动完成后续节点的关联、遍历,直到满足终止条件。

具体实现方案

方案1:使用Kusto原生graph算子(最简洁,适配当前最新集群版本)

第一步:先构造测试用的样例表(可直接替换为你实际的Kusto表)

let T = datatable(Name:string, File:string, IngestType:string)
[
  "A", "F1", "output",
  "B", "F1", "input",
  "B", "F2", "output",
  "C", "F2", "input",
  "D", "F2", "input"
];

第二步:定义图的关联边

按照你业务的输入输出关联规则,自动生成所有节点间的连接关系:

let edges = T
| where IngestType == "output"
| project 输出节点 = Name, File
| join kind=inner (
  T | where IngestType == "input" | project 输入节点 = Name, File
) on File
| project src = 输出节点, dst = 输入节点;

第三步:执行自动递归遍历

支持自定义起始节点、最大遍历深度,输出结果可直接匹配你之前手动union的扁平层级格式:

// 可修改这两个参数适配实际需求
let 起始节点名 = "A";
let 最大遍历深度 = 10;

T
// 定义图结构:顶点为全表节点,边为之前定义的关联关系
| graph (
  v: T | project Name, File, IngestType,
  e: edges
)
// 执行遍历逻辑
| graph-traversal
  start = v | where Name == 起始节点名
  direction = forward
  max_depth = 最大遍历深度
  output = nodes
// 投影为和手动方案一致的扁平结构,附带层级深度
| project 
  Name,
  File,
  IngestType,
  所属层级 = graph_traversal_depth

遍历输出效果

针对你给出的样例数据,最终输出结果和手动逐层级查询的结果完全一致:

NameFileIngestType所属层级
AF1output0
BF1input1
BF2output1
CF2input2
DF2input2

如果需要保留父子节点的关联关系,只需要把graph-traversal的output参数改为edges,即可输出每一层的父子映射关系。
和你之前手动写10次join再union的方案相比,这种写法冗余代码减少90%以上,哪怕要扩展到上百层遍历,也只需要调整深度参数即可,不会出现层级关联逻辑写错的问题。

关键注意事项

  • 必须设置合理的最大遍历深度,避免业务中出现循环依赖(例如A的输出被B消费,B的输出又被A消费)导致无限遍历
  • 所有的关联规则只需要在edges定义环节调整一次,后续修改遍历深度、起始节点都不需要改动关联逻辑

内容的提问来源于stack exchange,提问作者Alexandru Antochi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 01:36:10