问题描述
我正在运行查询以将 splunk 结果分叉到存储桶中。我想根据文件在磁盘上占用的大小来划分和计算文件。这可以使用 rangemap
或 eval case
来实现。
当我阅读 here 时,使用 eval
比 rangemap
快。但是我在使用两者时得到了不同的结果。
这是我正在运行的查询 -
<source>
| eval size_group = case(SizeInMB < 150,"0-150 MB",SizeInMB < 200 AND SizeInMB >= 150,"150-200 MB",SizeInMB < 300 AND SizeInMB >= 200,"200-300 MB",SizeInMB < 500 AND SizeInMB >= 300,"300-500 MB",SizeInMB < 1000 AND SizeInMB >= 500,"500-1000 MB",SizeInMB > 1000,">1000 MB")
| stats count by size_group
这是我得到的结果 -
而使用 rangemap
这是查询 -
<source>
| rangemap field=SizeInMB "0-150MB"=0-150 "151-200MB"=150-200 "201-300MB"=200-300 "301-500MB"=300-500 "501-999MB"=500-1000 default="1000MB+"
| stats count by range
我也尝试过这个范围 - rangemap field=SizeInMB "0-150MB"=0-150 "150-200MB"=150-200 "200-300MB"=200-300 "300-500MB"=300-500 "500-1000MB"=500-1000 default="1000MB+"
并且得到相同的结果 -
这两个图像结果没有太大差异,我们可能可以接受它 - 但我看到 150-200MB 的范围 - 它是 445958 vs 445961
,而对于 200-300 MB,它是 { {1}},对于 300-500 MB,它是 3676 vs 3677
。我想了解为什么会有这种差异,我应该更信任哪一个? Speedwise 3346 vs 3348
似乎更好,但 datawise 不是那么正确吗?
解决方法
您看到的问题是您的 rangemap
具有重叠值。
而对于 eval
格式,您使用 case
来“正确”修剪范围。
侧边栏 - 您可以这样简化 case
:
| eval size_group = case(SizeInMB < 150,"0-150 MB",SizeInMB < 200,"150-200 MB",SizeInMB < 300,"200-300 MB",SizeInMB < 500,"300-500 MB",SizeInMB < 1000,"500-1000 MB",0=0,">1000 MB")
由于 case
表达式在匹配后立即停止计算,因此无需像以前那样使用 AND
。使用 0=0
作为最后一种可能性将总是评估为真(想想 C 或 C++ 中 default
语句中的 case
)。