【发布时间】:2016-06-09 22:02:20
【问题描述】:
我有一个数据源,我需要在其中返回来自单个数据源的所有事件对(event1、event2),其中 event1 中的 field1 与 event2 中的 field2 匹配。
例如,假设我有以下数据。
我需要返回一对事件,其中来自 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;
返回下表,
这正是我需要的数据。
现在,我一直在尝试在 splunk 查询中复制这一点,但遇到了很多问题。首先,我尝试使用 transaction 命令,但它会将所有相关事件聚合在一起,而不是一次将它们匹配一对。
接下来,我尝试使用子搜索,首先找到 id,然后在子搜索中搜索,首先通过 id 搜索第一个事件,然后附加第二个事件referral_id。然后,由于 append 创建一个新行而不是附加到同一行,因此使用 stats 通过匹配的 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 查询相比。当然,必须存在一种更简单、更快的方法来完成此操作,它不受任意有限设置或多个重复搜索查询的限制。我将不胜感激。
【问题讨论】:
-
你考虑过
join吗? -
我考虑过加入。它没有返回我需要的所有结果 - 它只会返回两行而不是三行,仅在 B 上匹配 A,而不是在 B 和 C 上匹配 A。
标签: splunk