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

如何使用Kusto合并存在重叠元素的字符串集合?

用Kusto合并有共享元素的字符串集合

要解决这个合并连通集合的问题,核心是找到所有元素的连通分量(即有直接/间接共享元素的元素组),再将每个分量合并成一个集合。由于Kusto没有while循环,我们可以用递归函数实现传递闭包来完成合并,具体步骤如下:

实现代码

let InputSets = datatable(Set: dynamic)
[
    dynamic(["Apple", "Banana"]),
    dynamic(["Apple", "Banana", "Cherry"]),
    dynamic(["Banana", "Cherry"]),
    dynamic(["Nissan", "Mazda"]),
    dynamic(["Giraffe", "Hare", "Ibis"]),
    dynamic(["Hare", "Ibis", "Jellyfish"])
];
// 给每个集合分配唯一ID,拆分每个集合为单个元素行
let exploded = InputSets
    | extend SetId = row_number()
    | mv-expand element = Set to typeof(string);

// 生成同一集合内元素的直接关联关系
let element_links = exploded
    | join kind=inner exploded on SetId
    | where element != element1
    | project element, linked_element = element1
    | distinct element, linked_element;

// 递归计算连通分量的传递闭包
let rec compute_components = (components:(*))
{
    let new_components = components
        | join kind=inner element_links on $left.component == $right.element
        | project element = linked_element, component = component
        | distinct element, component;
    let combined = components | union new_components | distinct element, component;
    // 若没有新增组件则返回,否则继续递归合并
    iff(combined | count == components | count, combined, compute_components(combined))
};

// 初始化:每个元素自身为一个独立组件
let initial_components = exploded | distinct element | project element, component = element;
let final_components = compute_components(initial_components);

// 按组件分组,合并为最终集合并去重
final_components
| summarize elements = make_set(element) by component
| distinct elements
| project elements

代码说明

  1. 拆分集合:给每个输入集合分配唯一ID,用mv-expand把每个集合拆成单个元素的行,方便后续关联。
  2. 建立元素关联:通过同一SetId关联,生成同一集合内所有元素的两两直接链接。
  3. 递归合并连通分量:从每个元素自身为组件开始,不断将链接的元素合并到同一组件,直到没有新的合并发生(即连通分量稳定)。
  4. 生成最终集合:按组件分组,用make_set收集所有元素并去重,再去掉重复的集合结果。

运行后会输出你期望的三个合并后的集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:45