0

我正在运行一个查询以将 splunk 结果分叉到存储桶中。我想根据它们在磁盘上的大小来划分和计算文件。这可以使用rangemap或来实现eval case

正如我在这里所读到的,使用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 它是3676 vs 3677,对于 300-500 MB 它是3346 vs 3348。我想了解为什么会有这种差异,我应该更信任哪一个?Speedwiseeval似乎更好,但 datawise 是不是不太正确?

4

1 回答 1

2

您看到的问题是您的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++中的defaultin语句)。case

于 2021-04-20T13:20:14.513 回答