如何在ADF数据流主Kusto查询的Where子句中使用另一Kusto源输出?
解决方案:在主Kusto查询的Where子句中引用另一Kusto源的结果
完全可以实现,且能避免lookup/join带来的内存溢出问题,推荐两种高效方案:
方案1:Kusto原生子查询(最推荐)
直接在主Kusto查询中嵌入子查询,让Kusto引擎自行处理过滤逻辑,所有操作都在Kusto端完成,不需要ADF做中间数据处理。
修改后的主查询示例:
Table | project column1, column2, column3 | where SubscriptionId in ( // 从CPCDevices源获取需要的订阅ID列表 CPCDevices | project SubscriptionId | summarize distinct(SubscriptionId) // 去重避免重复值 ) // 后续查询逻辑...
这种方式的优势是Kusto会自动优化查询计划,将子查询的结果作为过滤条件直接应用在主表扫描阶段,避免全表加载后再过滤,性能和内存占用都更优。
方案2:ADF数据流参数传递
如果你需要通过ADF数据流来传递订阅ID列表,可按以下步骤配置:
- 处理CPCDevices源输出:
- 在CPCDevices源后添加聚合转换,选择「不分组」,添加聚合列
SubIdArray,使用表达式collect_list(tostring(SubscriptionId)),将所有订阅ID收集为字符串数组。 - 再添加派生列转换,生成适合Kusto
in语法的格式,比如用表达式strcat("(", strcat_array(SubIdArray, ","), ")"),得到类似("sub-xxx","sub-yyy")的字符串。 - 添加缓存接收器,将处理后的结果缓存到数据流中。
- 在CPCDevices源后添加聚合转换,选择「不分组」,添加聚合列
- 配置主Kusto源:
- 在主Kusto源的查询中,将Where子句改为:
Table | project column1, column2, column3 | where SubscriptionId in {SubIdParam} // 后续查询逻辑... - 在源的参数设置中,添加参数
SubIdParam,绑定到缓存中的派生列值。
- 在主Kusto源的查询中,将Where子句改为:
关键注意事项
- 若用参数传递方式,务必确保生成的字符串格式符合Kusto语法:字符串类型的订阅ID需要包裹双引号,数字类型则不需要。
- 优先选择方案1,因为它完全利用Kusto的查询优化能力,避免ADF端处理大量数据,从根源上杜绝内存溢出风险。
内容的提问来源于stack exchange,提问作者Guilherme Matheus
相关产品推荐
相关产品推荐

