我使用德鲁伊来监控我网站上的活动。 数据可表示如下:
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查询:
当然,我的数据远大于此数据,并且包含许多国家/地区。 topNResults api必须有阈值参数,表示我想要作为响应获得的最大结果数量。
问题是如果我的阈值小于实际结果,那么这两个查询可能没有相同的国家/地区结果。
目前,我将重叠结果合并到我的服务器中,但是我放弃了一些国家/地区的结果,并且显示的结果低于我的阈值,但结果更多。
我可以做些什么来优化我的阈值总是会有相同的国家/地区(不会将从第一个查询返回的国家/地区列表发送到第二个过滤器 - 我尝试了它并且速度非常慢)?
答案 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
享受!