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

如何在Kusto中以标量函数形式优雅实现二进制字符串转十进制

在Kusto中将二进制字符串转换为十进制(封装为标量函数)

当然可以将二进制转十进制的逻辑封装为标量函数,这样就能在多列中直接复用,避免重复编写代码。以下是基于你第二种方法优化后的封装实现:

标量函数实现

let BinaryStringToDecimal = (binaryStr: string) {
    // 将二进制字符串拆分为字符数组并反转,使最低位对应索引0
    let reversedBits = array_reverse(extract_all('(.)', binaryStr));
    // 计算每个位的十进制值并求和,用toscalar将聚合结果转为标量
    toscalar(
        reversedBits
        | mv-apply bit = reversedBits on (
            summarize sum(toint(bit) * pow(2, row_number(0)))
        )
    )
};

使用示例

调用该函数处理多列二进制字符串时,只需直接调用函数名即可:

// 定义标量函数
let BinaryStringToDecimal = (binaryStr: string) {
    let reversedBits = array_reverse(extract_all('(.)', binaryStr));
    toscalar(
        reversedBits
        | mv-apply bit = reversedBits on (
            summarize sum(toint(bit) * pow(2, row_number(0)))
        )
    )
};

// 测试数据表(包含多列二进制字符串的场景)
let T = datatable(binaryCol1:string, binaryCol2:string)
[
    "01000001000011010000001000100101", "11001001001000100111",
    "1010", "11",
    "1001", "0011"
];

// 对多列调用转换函数
T
| extend DecimalCol1 = BinaryStringToDecimal(binaryCol1),
         DecimalCol2 = BinaryStringToDecimal(binaryCol2)

与你现有方法的对比

  • 方法一:依赖排序和行号重置逻辑,当二进制值重复时需要额外处理,且无法直接作为标量函数复用,多列场景下代码冗余度高。
  • 方法二:逻辑更简洁,基于数组反转和mv-apply的聚合计算,天然适合封装为标量函数,完美解决多列复用的需求。

持久化函数(可选)

如果需要让该函数在整个集群中全局可用,可以创建持久化函数:

.create function with (folder = "CustomFunctions") BinaryStringToDecimal(binaryStr: string) {
    let reversedBits = array_reverse(extract_all('(.)', binaryStr));
    toscalar(
        reversedBits
        | mv-apply bit = reversedBits on (
            summarize sum(toint(bit) * pow(2, row_number(0)))
        )
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:05:15