如何使用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
代码说明
- 拆分集合:给每个输入集合分配唯一ID,用
mv-expand把每个集合拆成单个元素的行,方便后续关联。 - 建立元素关联:通过同一SetId关联,生成同一集合内所有元素的两两直接链接。
- 递归合并连通分量:从每个元素自身为组件开始,不断将链接的元素合并到同一组件,直到没有新的合并发生(即连通分量稳定)。
- 生成最终集合:按组件分组,用
make_set收集所有元素并去重,再去掉重复的集合结果。
运行后会输出你期望的三个合并后的集合。
内容的提问来源于stack exchange,提问作者Clerk
相关产品推荐
相关产品推荐

