如何在Kusto中创建datatable时使用用户自定义标量
预先定义标量变量后应用到datatable的实现方法
KQL 中 datatable 的内置字面量填充数组仅支持传入常量值,不允许直接引用预先定义的 let 标量变量,直接在数组位置写变量名会触发解析报错。要实现该需求可使用以下三种常用方案,按简洁度排序:
方法1:直接条件赋值法(最简洁)
如果可以通过datatable本身的列值判断需要匹配的变量,直接用extend结合条件函数赋值即可,示例代码:
let dayOne = "Day One"; let dayTwo = "Day Two"; let dayStringMapping = datatable(Batch: int64, BatchDay: string) [ 1, "", 2, "" ] // 用现有列Batch做条件,直接赋值对应标量变量 | extend BatchDay = case(Batch == 1, dayOne, Batch == 2, dayTwo, ""); dayStringMapping
方法2:占位符替换法
如果需要替换的位置无法通过现有列判断,可先给datatable写入临时占位符字符串,再批量替换为预先定义的标量值,示例代码:
let dayOne = "Day One"; let dayTwo = "Day Two"; // 先定义datatable结构,需替换位置写入固定占位符 let rawDatatable = datatable(Batch: int64, BatchDay: string) [ 1, "__PLACEHOLDER_1__", 2, "__PLACEHOLDER_2__" ]; // 批量替换占位符为预先定义的标量值 let dayStringMapping = rawDatatable | extend BatchDay = case( BatchDay == "__PLACEHOLDER_1__", dayOne, BatchDay == "__PLACEHOLDER_2__", dayTwo, BatchDay ); dayStringMapping
方法3:交叉连接赋值法
先把标量变量通过print转成单行小表,和datatable做交叉连接后,将对应变量值赋值给目标列,适合变量数量较多的映射场景,示例代码:
let dayOne = "Day One"; let dayTwo = "Day Two"; // 将标量变量转为单行小表 let scalarMapping = print d1 = dayOne, d2 = dayTwo; // 定义datatable结构后交叉连接小表,赋值目标列 let dayStringMapping = datatable(Batch: int64, BatchDay: string) [ 1, "", 2, "" ] | evaluate cross_join(scalarMapping) | project Batch, BatchDay = case(Batch == 1, d1, Batch == 2, d2); dayStringMapping
场景适配说明
- 可通过现有列判断映射关系时优先用方法1,性能和简洁度最优
- 映射规则和现有列无关时优先用方法2,维护成本更低
- 批量映射大量标量时可选用方法3,减少重复条件判断的代码量
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

