如何在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
相关产品推荐
相关产品推荐

