在KQL中使用掩码数组:将源数组掩码为0的位置替换为null
KQL数组掩码替换函数实现
需求
创建一个KQL函数,接收两个数值类型数组:
- 源数组(
src) - 掩码数组(
mask)
输出变形后的源数组:当掩码数组对应位置元素为0时,将源数组该位置的值替换为null。
初始错误尝试
最初的代码逻辑无法直接运行,KQL不支持这种数组下标直接赋值的写法:
let replace_with_nulls = (src:dynamic, mask:dynamic) { src[i] = mask[i]==0 ? null : src[i] };
可行实现方案
通过mv-expand拆分数组、逐元素判断后重新聚合的方式,可以实现需求,以下是可直接用于表的完整函数:
let replace_with_nulls = (src:dynamic, mask:dynamic) { let temp_table = print src_col = src, mask_col = mask; temp_table | mv-expand src_col, mask_col to typeof(long) | extend res_col = iif(mask_col == 0, long(null), src_col) | summarize result = make_list_with_nulls(res_col) }; // 测试示例 datatable (src:dynamic, mask:dynamic)[ dynamic([1, 2, 3, 4,5]), dynamic([0, 1, 0, 1,0]) ] | extend tgt = replace_with_nulls(src, mask);
代码解析
- 用
print生成临时表,将两个输入数组转为列 mv-expand将数组拆分为单行单个元素,同时指定元素类型(这里用long,可根据实际数值类型调整为int/double等)iif判断掩码元素是否为0,满足条件则返回null,否则保留源数组元素make_list_with_nulls将处理后的元素重新组合为包含null的数组(无需series_fill_forward,因为需求是保留null而非填充)
内容的提问来源于stack exchange,提问作者Biggles
相关产品推荐
相关产品推荐

