如何在Splunk中实现带by子句的fit命令功能?
解决Splunk按多字段分组执行fit命令的问题
要实现按a、b、c三个字段的16种组合分别生成模型并应用数据,你可以通过缓存原始数据+map命令突破子查询限制的方式解决,具体方案如下:
可行查询代码
| makeresults count=100000 | eval a=if(random()%2==0,"apple", "banana") | eval b=if(random()%2==0,"cherry","date") | eval c=if(random()%2==0,"eggplant",if(random()%2==0,"fig",if(random()%2==0,"grape","huckleberry"))) | eval x=random() | eval y=random()%x | tempname original_data // 将生成的测试数据缓存为临时搜索 | dedup a b c // 获取所有唯一的a/b/c分组组合(共16种) | map maxsearches=16 search="`original_data` | search a=\"$a$\" b=\"$b$\" c=\"$c$\" | fit LinearRegression y from x as predicted_y | eval group_a=\"$a$\", group_b=\"$b$\", group_c=\"$c$\""
方案说明
- 缓存原始数据:用
tempname命令把生成的10万条测试数据存为临时搜索对象original_data,避免每个子查询重复生成数据,提升效率。 - 提取唯一分组:
dedup a b c会得到16个不重复的分组组合,作为后续map遍历的对象。 - 突破map子查询限制:默认
map最多允许10个子查询,通过显式设置maxsearches=16,刚好覆盖所有分组。每个子查询会过滤出对应分组的数据,执行fit命令生成模型并输出预测结果,最后添加分组标识字段方便后续分析。
为什么之前的方法不行?
- map默认限制:默认
maxsearches=10,无法覆盖16个分组,手动设置参数即可解决。 - foreach报错原因:
foreach属于流式命令,要求管道内的所有命令都是流式的,但fit是非流式命令,因此无法在foreach中使用。
内容的提问来源于stack exchange,提问作者John Arrowwood
相关产品推荐
相关产品推荐

