6

我使用 Druid 来监控我网站中的事件。数据可以表示如下:

event_id   |  country  |  user_id  |  event_type  
================================================
1          |  USA      |  id1      |  visit
2          |  USA      |  id2      |  visit
1          |  Canada   |  id3      |  visit
3          |  USA      |  id1      |  click
1          |  Canada   |  id4      |  visit
3          |  Canada   |  id3      |  click
3          |  USA      |  id2      |  click

我还定义了一个用于计数事件的聚合。我向 Druid 查询以显示 event_id=3 的数据,如下所示:

请注意,访问与 event_id 无关。

country   |  visits    | clicks  
===============================    
USA       |  4         |  2
Canada    |  3         |  2

目前,我使用两个带有 2 个不同过滤器的 topNResults 查询:

  1. event_type = visit -> 计算每个国家/地区的访问次数,而不考虑事件 ID。
  2. event_id = 3

当然,我的数据要大得多,并且包含许多国家。topNResults api 必须具有阈值参数,该参数表示我希望作为响应获得的最大结果量。

问题是如果我的阈值小于实际结果,那么这两个查询可能不会具有相同的国家/地区结果。

目前,我在我的服务器中合并了重叠的结果,但我丢失了一些国家的结果,并且显示的结果低于我的阈值,尽管有更多的结果。

我可以做些什么来优化我的阈值总是相同的国家(没有将从第一个查询返回的国家列表发送到第二个过滤器 - 我试过了,它很慢)?

4

1 回答 1

2

Sounds Filtered Aggregator 将为您保存所有查询。
过滤聚合器仅聚合与维度过滤器匹配的值。
以下查询将在您的情况下解决问题:在德鲁伊将所有事件分组后(因为维度是国家/地区),聚合器过滤器将过滤其事件 ID 在 (e1,e2) 中的所有事件并在过滤结果。

{
  ...
  "dimension":"country",
  ...,
   "aggregations": [
      {
        "type" : "filtered",
        "filter" : {
           "type" : "selector",
           "dimension" : "event_id",
           "value" : ["1","2"]
           "type": "in"
         }
        "aggregator" : {
          "type" : "count", 
          "name" : "count_countries" }
        }
      }
   ]
 }

让我们把你的桌子。

event_id   |  country  |  user_id  |  event_type  
================================================
1          |  USA      |  id1      |  visit
2          |  USA      |  id2      |  visit
1          |  Canada   |  id3      |  visit
3          |  USA      |  id1      |  click
1          |  Canada   |  id4      |  visit
3          |  Canada   |  id3      |  click
3          |  USA      |  id2      |  click

Druid 将按国家/地区对结果进行分组。

  country  |  user_id  |  event_type | event_id    
================================================
  USA      |  id1      |  visit  |  1
  USA      |  id2      |  visit  |  2
  USA      |  id1      |  click  |  1
  USA      |  id2      |  click  |  3
  Canada   |  id3      |  visit  |  1 
  Canada   |  id4      |  visit  |  3
  Canada   |  id3      |  click  |  3

由于我们的过滤器,聚合器过滤器将删除所有 event_id=3 ("value" : ["1","2"])

  country  |  user_id  |  event_type | event_id    
================================================
  USA      |  id1      |  visit  |  1
  USA      |  id2      |  visit  |  2
  USA      |  id1      |  click  |  1
  Canada   |  id3      |  visit  |  1 

并返回以下结果(我们的聚合器是简单计数)

  country  |  count   
===================
  USA      |  3   
  Canada   |  1   

享受!

于 2017-04-24T12:14:58.840 回答