我有一个数据源,我需要从单个数据源返回所有事件对(event1,event2),其中event1的field1与event2的field2匹配。
例如,我们说我有以下数据。
我需要返回一对事件,其中event1中的字段 id ,匹配来自event2的字段 referrer_id 。让我们说,以获得以下报告。
在sql中,我可以使用以下命令轻松完成此操作。
select a.first_name as first1, a.last_name as last1, b.first_name as first2,
b.last_name as last2, b.date as date
from myTable a
inner join myTable b on a.id = b.referrer_id;
返回下表
提供了我需要的数据。
现在,我一直试图在splunk查询中复制它,并遇到了很多问题。首先,我尝试使用事务命令,但是将所有相关事件聚合在一起,而不是一次匹配它们。
接下来,我尝试使用子搜索,首先找到 id ,然后在子搜索中搜索,首先通过 id 查找第一个事件,然后添加第二个事件通过 referral_id 。然后,由于追加会创建新行而不是追加到同一行,因此使用统计信息按匹配的ID字段聚合生成的行。我确实尝试使用 appendcols ,但这并没有为我返回任何内容。
...
| table id
| map search="search id=$id$
| fields first_name, last_name, id
| rename first_name as first1
| rename last_name as last1
| rename id as match_id
| append [search $id$
| search referral_id=$id$
| fields first_name, last_name, referral_id, date
| rename first_name as first2
| rename last_name as span2
| rename referral_id as match_id]"
| fields first1, last1, first2, last2, match_id, time
| stats values(first1) as first1, values(last1) as last1, values(first2) as first2,
values(last2) as last2, values(time) as time by id
以上查询对我有用,并为我提供了我需要的表格,但由于在整个时间范围内重复搜索,并且还受到地图 maxsearches 的限制,因此速度非常慢,无论什么原因,都不能设置为无限制。
这似乎是一个过于复杂的解决方案,特别是与sql查询相比。当然,必须存在一种更简单,更快速的方法,这种方式不受任意有限设置或多次重复搜索查询的限制。我非常感谢任何帮助。
答案 0 :(得分:0)
我最后使用追加。使用join给了我更快的结果,但没有产生每个匹配对,对于我的例子,它将返回2行而不是3行,返回Adam与Betty,但不返回Adam与Carol。
使用append返回一个完整的列表,并使用ids stats给我我想要的结果,每个匹配对的完整列表。它还提供了额外的空字段,因此我必须删除它们,然后将生成的mv操作到它们各自的行中。 Splunk没有提供多字段mv扩展,所以我使用了一种解决方法。
...
| rename id as matchId, first_name as first1, last_name as last1
| table matchId, first1, last1
| append [
search ...
| rename referrer_id as matchId, first_name as first2, last_name as last2
| table matchId, first2, last2, date]
| stats list(first1) as first1, list(last1) as last1, list(first2) as first2, list(last2) as last2, list(date) as date by matchId
| search first1!=null last1!=null first2!=null last2!=null
| eval zipped=mvzip(mvzip(first2, last2, ","), date, ",")
| mvexpand zipped
| makemv zipped delim=","
| eval first2=mvindex(zipped, 0)
| eval last2=mvindex(zipped, 1)
| eval date=mvindex(zipped, 2)
| fields - zipped
这比使用具有多个子搜索的地图更快,并提供所有结果。它仍然受到子搜索的最大大小的限制,但至少提供了必要的数据。