Пересечение двух запросов с разными фильтрами

Я использую 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 -> для подсчета посещений по стране независимо от идентификатора события.
  2. event_id = 3

Конечно, мои данные намного больше и содержат много стран. api topNResults должен иметь параметр threshold, который представляет максимальное количество результатов, которые я хочу получить в качестве ответа.

Проблема в том, что если мой порог меньше фактических результатов, эти два запроса могут иметь разные результаты по странам.

В настоящее время я объединяю перекрывающиеся результаты на моем сервере, но я теряю результаты для некоторых стран и показываю меньше, чем мой порог, хотя результатов больше.

Что я могу сделать, чтобы оптимизировать, чтобы у меня всегда были одни и те же страны для моего порога (без отправки списка стран, возвращенных из первого запроса, во второй фильтр - я пробовал, и это было очень медленно)?


person orenMos    schedule 22.12.2016    source источник


Ответы (1)


Sounds Filtered Aggregator сохранит все запросы.
Filtered Aggregator объединит только те значения, которые соответствуют фильтру параметров.
Следующий запрос поможет в вашем случае: After druid сгруппирует все события по странам (потому что измерение - страна) фильтр агрегатора отфильтрует все события, в которых указаны идентификаторы событий (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 из-за нашего фильтра ("значение": ["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   

Наслаждаться!

person user2303962    schedule 24.04.2017