Kusto中如何传递多值实现跨集群跨表匹配查询
Kusto跨集群多值匹配查询实现方案
你原有代码的核心问题是把表结果集x当成了单个标量值使用,Kusto是面向集合的查询引擎,不需要编写foreach类行遍历逻辑,直接通过集合运算即可实现跨集群匹配需求。
方案1:仅返回y集群中匹配到的记录
如果不需要保留x表原始记录和y表匹配结果的对应关系,直接用has_any做集合匹配即可,性能最优:
// 先从x集群拉取目标匹配值,提前做裁剪减少跨集群传输的数据量 let x = cluster('xcluster.kusto.windows.net').database('xdatabase').xtable | take 10 // 提前拼接你需要的"a"前缀,只保留用于匹配的单字段 | project MatchKey = strcat("a", Name) ; cluster('ycluster.kusto.windows.net').database('ydatabase').ytable // 匹配x结果集中任意一个MatchKey值 | where Name has_any(x) | take 10
方案2:保留x表记录与y表匹配结果的对应关系
如果需要拿到x中每个名称对应的y表匹配记录,使用join做跨集群关联即可:
let x = cluster('xcluster.kusto.windows.net').database('xdatabase').xtable | take 10 | project OriginalName = Name, MatchKey = strcat("a", Name) ; let y = cluster('ycluster.kusto.windows.net').database('ydatabase').ytable; x // 左连接保证x里的10条名称全部保留,即使y里没有匹配记录也会返回 | join kind=leftouter y on $left.MatchKey == $right.Name | take 100
注意事项
- 跨集群查询时尽量提前裁剪不需要的列、过滤不需要的行,减少跨集群数据传输量,可大幅提升查询速度
- 如果是精确匹配场景,把
has/has_any替换为==/in,查询性能会更高 - 不要使用行级遍历的思路写Kusto查询,内置的集合运算性能比自定义行循环高几个数量级
内容的提问来源于stack exchange,提问作者Rana
相关产品推荐
相关产品推荐

