Splunk - 匹配来自同一数据源的不同事件中的不同字段

时间:2016-06-09 22:02:20

标签: splunk

我有一个数据源,我需要从单个数据源返回所有事件对(event1,event2),其中event1的field1与event2的field2匹配。

例如,我们说我有以下数据。

enter image description here

我需要返回一对事件,其中event1中的字段 id ,匹配来自event2的字段 referrer_id 。让我们说,以获得以下报告。

  • Adam Anderson在2016-01-02 08:00:00.000
  • 上提到Betty Burger
  • Adam Anderson于2016-01-03 08:00:00.000
  • 推荐Carol Camp
  • Betty Burger于2016-01-04 08:00:00.000
  • 推荐Darren Dougan

在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;

返回下表

enter image description here

提供了我需要的数据。

现在,我一直试图在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查询相比。当然,必须存在一种更简单,更快速的方法,这种方式不受任意有限设置或多次重复搜索查询的限制。我非常感谢任何帮助。

1 个答案:

答案 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

这比使用具有多个子搜索的地图更快,并提供所有结果。它仍然受到子搜索的最大大小的限制,但至少提供了必要的数据。