如何让Kusto中make_list的maxSize参数接受用户函数参数?
Kusto
make_list() 参数校验问题解决办法 问题描述
当我将用户函数参数传入
make_list()的maxSize参数时,出现以下错误:
Relop semantic error: SEM0248: make_list() function expects an integer in range [1..1048576] for argument 2
请问是否有办法让Kusto识别该参数的值是有效的?我的代码示例如下:let GetSaturatedVersions = ( T:(time: datetime, version:string, server:string), ts:timespan = 10d, n:int = 10) { let saturated_versions = T | where time > ago(ts) | summarize by time = startofday(time), version, server | summarize count() by version, time | order by time asc, count_ desc | summarize Versions = make_list(version, n), Counts = make_list(count_, n) by time ; saturated_versions }; GetSaturatedVersions(MyTable) | take 100
解决办法
Kusto的静态类型检查会在编译阶段校验make_list()的maxSize参数范围,但函数参数的动态取值无法被自动推断,因此需要手动确保参数落在有效区间内,具体有两种可行方案:
1. 用assert做参数校验
在函数开头添加assert语句强制校验参数范围,既可以通过编译阶段的SEM0248检查,也能在运行时拦截无效输入:
let GetSaturatedVersions = ( T:(time: datetime, version:string, server:string), ts:timespan = 10d, n:int = 10) { // 显式校验参数n的范围 assert(n >= 1 and n <= 1048576); let saturated_versions = T | where time > ago(ts) | summarize by time = startofday(time), version, server | summarize count() by version, time | order by time asc, count_ desc | summarize Versions = make_list(version, n), Counts = make_list(count_, n) by time ; saturated_versions }; GetSaturatedVersions(MyTable) | take 100
2. 用iif钳制参数到合规区间
如果需要兼容可能的无效外部输入,可以用iif将参数强制限定在[1, 1048576]范围内:
let GetSaturatedVersions = ( T:(time: datetime, version:string, server:string), ts:timespan = 10d, n:int = 10) { // 将n强制钳制到有效区间内 let valid_n = iif(n < 1, 1, iif(n > 1048576, 1048576, n)); let saturated_versions = T | where time > ago(ts) | summarize by time = startofday(time), version, server | summarize count() by version, time | order by time asc, count_ desc | summarize Versions = make_list(version, valid_n), Counts = make_list(count_, valid_n) by time ; saturated_versions }; GetSaturatedVersions(MyTable) | take 100
原理说明
Kusto的静态校验无法推断函数参数的动态取值范围,必须显式确保传入make_list()的参数符合要求。assert会让编译阶段识别到参数已被校验,从而通过错误检查;钳制参数的方式则能在运行时保证输入合规,同时通过编译校验。
内容的提问来源于stack exchange,提问作者Tatiana Racheva
相关产品推荐
相关产品推荐

