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

在Kusto中解析含+/-标记的CSV列并生成集合执行集合运算

Kusto实现带标记CSV列的集合提取与运算

假设你的表名为MyTable,存储带标记CSV的列名为TagList,可以通过以下步骤实现需求:

完整查询示例

// 模拟示例数据(实际使用时替换为你的表)
let MyTable = datatable(TagList:string) [
    "+a1,-a2,+a3,+a4",
    "+a1,-a2,-a3,+a4",
    "+a1,+a2,+a3,-a4"
];
// 核心逻辑
MyTable
| mv-expand split(TagList, ",") as TagItem
| parse TagItem with sign:char(1) Name:string
| summarize 
    IncludedSet = make_set_if(Name, sign == "+"),
    ExcludedSet = make_set_if(Name, sign == "-")
| project 
    IncludedSet,
    ExcludedSet,
    NeverExcluded = set_difference(IncludedSet, ExcludedSet)

步骤说明

  • 拆分并展开条目:用split(TagList, ",")把每行的CSV字符串拆分成单个标记的数组,再通过mv-expand将数组展开为多行,每行对应一个带符号的名称。
  • 提取符号与名称:parse TagItem with sign:char(1) Name:string从每个标记中分离出第一个字符(+/-)作为符号,剩余部分作为名称。
  • 生成集合:make_set_if函数分别收集符号为+和-的唯一名称,生成包含集合和排除集合。
  • 计算从未被排除的项:set_difference(IncludedSet, ExcludedSet)计算包含集合与排除集合的差集,得到从未被标记为排除的名称。

示例结果

执行上述查询后,输出结果如下:

IncludedSetExcludedSetNeverExcluded
["a1","a2","a3","a4"]["a2","a3","a4"]["a1"]

完全符合你期望的结果:包含集合是所有出现过的带+的名称,排除集合是所有出现过的带-的名称,差集a1即为从未被禁用的项。

性能优化建议

针对数百万行的数据量,可参考以下优化点:

  • 如果TagList列的数据格式稳定,优先使用parse而非字符串截取函数,性能更优。
  • 若无需保留原始行数据,可在mv-expand后直接进入聚合步骤,减少中间数据量。
  • 对于超大数据集,可考虑使用materialize缓存中间结果,避免重复计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:33:14