如何正确定义并调用接收多列表格参数的Kusto用户自定义函数
Kusto自定义函数传入多列参数的解决方法
问题核心原因
你当前的写法存在两处类型不匹配问题:
- 你定义的
foo函数入参是单个表格类型参数,要求入参为包含col1、col2两个字符串列的表,但你在summarize中传入的是Col1、Col2两个独立的标量列,和函数定义的入参类型完全不匹配。 - Kusto的
summarize聚合上下文内调用接收表格参数的函数,需要先把当前聚合分组内的指定列打包为表格格式再输入。
解决方案
方案1:保留表格类型入参的函数定义(适配分组内多行处理场景)
如果你的函数逻辑需要处理每个Col3+Col4分组内的所有Col1、Col2多行数据,只需要调整调用方式,用pack_table()函数把分组内的两列打包为符合入参要求的临时表即可:
let foo=(T1:(col1:string, col2:string)) { T1|count // 后续替换为你的复杂逻辑即可 }; someTable | summarize Res=foo(pack_table('col1', Col1, 'col2', Col2)) by Col3, Col4
pack_table()会自动把当前分组内的Col1、Col2值拼接为列名分别为col1、col2的临时表,完全匹配你定义的函数入参结构。
方案2:调整函数为标量入参(适配单行数据处理场景)
如果你的函数逻辑实际只需要处理单行的两个值,不需要操作多行表格,直接修改函数定义为接收两个标量参数即可,写法更简单:
let foo=(col1:string, col2:string) { // 替换为针对单行两个值的处理逻辑即可 strcat(col1, '_', col2) }; someTable | extend Res=foo(Col1, Col2) | summarize by Col3, Col4, Res
注意事项
- 表格类型参数的函数不能直接接收分散的标量列,必须通过
pack_table、datatable等方式构造为符合结构定义的表格再传入。 - 如果逻辑仅涉及单行数据运算,优先使用标量入参的函数定义,执行效率更高。
内容的提问来源于stack exchange,提问作者Duka
相关产品推荐
相关产品推荐

