You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:02:35