使用不同的过滤器将两个查询相交

时间:2016-12-22 13:50:35

标签: 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

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

  1. event_type = visit - >无论事件ID如何,都要计算每个国家/地区的访问次数。
  2. event_id = 3
  3. 当然,我的数据远大于此数据,并且包含许多国家/地区。 topNResults api必须有阈值参数,表示我想要作为响应获得的最大结果数量。

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

    目前,我将重叠结果合并到我的服务器中,但是我放弃了一些国家/地区的结果,并且显示的结果低于我的阈值,但结果更多。

    我可以做些什么来优化我的阈值总是会有相同的国家/地区(不会将从第一个查询返回的国家/地区列表发送到第二个过滤器 - 我尝试了它并且速度非常慢)?

1 个答案:

答案 0 :(得分:1)

声音过滤聚合器将为您保存所有查询 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

德鲁伊将按国家对结果进行分组。

  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   

享受!