Splunk上亿事件sort/streamstats过慢,如何用stats获取对应最小start的n值
解决Splunk分组聚合中获取最小start对应n值的问题
针对你的需求,要在每个id组中同时拿到最小start、最大end、n的总和,以及最小start对应的n值,可以用以下两种高效的方法实现:
方法一:结合eventstats标记目标值后聚合
这种方法无需全局排序,先给每个事件标记出所属id组的最小start,再筛选出对应n值后聚合,适合处理大规模数据:
| eventstats min(start) as min_start by id | eval n_at_min_start = if(start == min_start, n, null()) | stats min(start) as min_start, max(end) as max_end, sum(n) as total_n, values(n_at_min_start) as n_at_min_start by id | eval n_at_min_start = mvindex(n_at_min_start, 0)
步骤说明:
eventstats:为每个事件添加所属id组的最小start值(min_start),不改变事件数量eval:仅保留start等于min_start的事件的n值,其余设为nullstats:按id聚合时,用values()收集标记出的n值(每个id仅一个有效值)mvindex:将多值字段转为单值,确保结果格式统一
方法二:先分组内排序再取首个n值
利用sort按id分组后组内按start升序排序(因每组仅1-10条数据,排序开销远低于全局排序),再用first(n)直接取对应最小start的n值:
| sort 0 id start | stats min(start) as min_start, max(end) as max_end, sum(n) as total_n, first(n) as n_at_min_start by id
步骤说明:
sort 0 id start:先按id分组,同一id内按start升序排列,0表示不限制返回条数stats:按id聚合时,first(n)会取每组排序后的第一个n值,即对应最小start的n
两种方法都能避开你之前遇到的全局sort 0 start_time性能瓶颈,其中方法一的性能更优,无需额外排序操作。
内容的提问来源于stack exchange,提问作者Filip Kilibarda
相关产品推荐
相关产品推荐

