在Kibana的Vega中如何合并重叠的起止区间数据?
重叠区间合并Vega原生实现方案
完全基于Vega内置transform实现,无需自定义JavaScript代码,可直接在Kibana Vega环境中运行,实现逻辑如下:
- 先对原始区间按
start字段升序排序,保证所有区间按左端点从小到大排列 - 通过窗口函数记录上一个区间的右端点,给重叠区间打相同的分组标记
- 按分组聚合,每组取最小
start作为合并后区间的左端点,最大end作为合并后区间的右端点
完整transform配置示例
// 仅展示my_lines数据集的transform部分,其余配置按你原有逻辑保留即可 { "name": "my_lines", // 你的原始数据来源配置保持不变 "transform": [ // 1. 按start升序排序 {"type": "sort", "by": {"field": "start", "order": "ascending"}}, // 2. 用窗口函数获取上一个区间的end值 { "type": "window", "sort": {"field": "start", "order": "ascending"}, "ops": ["lag"], "fields": ["end"], "as": ["last_end"] }, // 3. 标记是否为新分组的起点:当前区间start大于上一个区间end时为新分组 { "type": "formula", "expr": "datum.last_end == null || datum.start > datum.last_end ? 1 : 0", "as": "is_new_group" }, // 4. 累加生成分组ID,重叠区间会分到同一个ID下 { "type": "window", "ops": ["sum"], "fields": ["is_new_group"], "as": ["group_id"] }, // 5. 按分组聚合得到合并后的区间 { "type": "aggregate", "groupby": ["group_id"], "fields": ["start", "end"], "ops": ["min", "max"], "as": ["start", "end"] } ] }
执行完上述transform后,my_lines数据集输出结果和你要求的预期结果完全一致。
内容的提问来源于stack exchange,提问作者pouyan
相关产品推荐
相关产品推荐

