Kusto查询如何仅投影非空值或删除含空值的列
Kusto查询过滤空值、移除全空列方案
两类常见需求的实现方法
1. 过滤包含空值的结果行
直接在查询中加where条件,用isnotempty()判断目标字段是否为空即可,该函数会同时识别null和空字符串""两种空值。
示例代码:
let table_name = datatable(name:string, date_part:datetime, job_1:string, job_2:string, job_3:string, job_4:string) [ "David", datetime(2022-05-9), "Architect", "", "", "Engineer" ]; table_name | where name == "David" // 修正原查询时间范围的问题:between需小值在前、大值在后,且范围要覆盖你的数据时间 | where date_part between (datetime(2022-05-01) .. datetime(2022-05-15)) // 过滤规则示例:保留job_1到job_4全部非空的行,可根据需求调整判断逻辑 | where isnotempty(job_1) and isnotempty(job_2) and isnotempty(job_3) and isnotempty(job_4) | project job_1, job_2, job_3, job_4
如果只需要过滤null值、保留空字符串,把isnotempty()替换为isnotnull()即可。
2. 移除整列全为空的列
没有内置一步到位的算子,可以通过narrow()+pivot()组合实现,自动丢弃所有全空的列,不需要手动枚举列名:
let table_name = datatable(name:string, date_part:datetime, job_1:string, job_2:string, job_3:string, job_4:string) [ "David", datetime(2022-05-9), "Architect", "", "", "Engineer" ]; table_name | where name == "David" | where date_part between (datetime(2022-05-01) .. datetime(2022-05-15)) | project job_1, job_2, job_3, job_4 // 将列转为键值对行结构,过滤掉空值 | evaluate narrow() | where isnotempty(Value) // 转回宽表结构,全空的列会被自动剔除 | evaluate pivot(Column, any(Value))
运行上面的示例,最终返回结果只会保留有值的job_1、job_4两列,全空的job_2、job_3会被自动移除。
原查询的注意点
between语法要求范围左值小于右值,你原来写的between (now() .. -10d)顺序颠倒,无法匹配到正确数据- 示例数据的时间是2022年5月,和当前时间差超过2年,用
now()-10d的范围根本匹配不到这条数据,测试时需要调整时间范围覆盖你的数据时间点。
内容的提问来源于stack exchange,提问作者mnm
相关产品推荐
相关产品推荐

