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

在Kusto中如何为表每行运行含toscalar()的自定义函数?

解决方案

问题根源

toscalar() 无法在行上下文(如 extend 中逐行计算的场景)中引用行级别的参数(比如 Param1),因为它是在标量上下文执行的,无法访问行变量,这就是你遇到 CRT0018 错误的原因。

正确实现方式

核心思路是预先批量计算所有需要的 Param1 对应的汇总值,再通过关联操作将汇总值与原表合并,最后逐行比较 Param2 和汇总值。

方法1:使用 lookup 操作符(最简洁)

let final_table = some_function(); // 假设此表包含 Param1 和 Param2 列
final_table
| lookup (
    // 先获取所有唯一的 Param1,调用函数获取数据并汇总
    final_table | distinct Param1 
    | invoke get_some_data(Param1) 
    | summarize sum_some_column = sum(some_column) by Param1
) on Param1
// 最后计算每行的 isBigger
| extend isBigger = Param2 > sum_some_column

方法2:封装为可复用函数

如果需要复用汇总逻辑,可以将批量计算逻辑封装成函数:

// 定义批量获取 Param1 对应汇总值的函数
let get_sum_by_param1 = (param1_set: (Param1:string)) {
    param1_set
    | invoke get_some_data(Param1)
    | summarize sum_some_column = sum(some_column) by Param1
};

let final_table = some_function();
// 先获取所有唯一的 Param1,传入函数得到汇总表
let sum_data = get_sum_by_param1(final_table | distinct Param1);
// 关联原表与汇总表,计算结果
final_table
| join sum_data on Param1
| extend isBigger = Param2 > sum_some_column

方案说明

  • 预先批量计算所有 Param1 的汇总值,彻底避免了逐行调用 toscalar() 带来的上下文冲突问题
  • 通过 join 或 lookup 将汇总值与原表的每一行关联,自然实现了逐行比较的需求

内容的提问来源于stack exchange,提问作者atahanksy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:15