Расчет статистического режима на Apache друид - PullRequest
0 голосов
/ 29 марта 2020

Мы используем Apache Druid для выполнения аналитики на основе временных рядов в наборе данных и застряли, пытаясь вычислить режим для одного из аналитиков.

Статистический режим сообщает нам о точке данных, которая чаще всего повторяется в наборе данных.

Пример: для данного набора данных, как показано ниже, попробуйте рассчитать наиболее представительную продажу корзина для каждого продукта

Набор данных:

Product ID  Month   Sale Bucket
Pid1    January 10-20
Pid1    February    0-10
Pid1    March   10-20
Pid2    January 0-10
Pid2    February    10-20
Pid2    March   0-10

Ожидаемый результат:

Product ID  Sale Bucket
Pid1    10-20
Pid2    0-10

Попытка простого поиска Google, чтобы найти, было ли что-то встроенное или расширение сделать то же самое. Не удалось найти.

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

Шаг 1. Получение соответствующих частот точки данных (группировка по идентификатору продукта и сегменту продаж), в результате чего

Product ID  Sale Bucket Frequency
Pid1    10-20   2
Pid1    0-10    1
Pid2    10-20   1
Pid2    0-10    2

Шаг 2. Получение соответствующей точки данных с максимальной частотой на продукт (из частот, рассчитанных в 1). Я застрял в этом пункте 2, попробовав 2 подхода:

  1. Объединить столбец, который будет выбран в качестве строки, а затем удалить его позже (Объясните здесь на stackoverflow: SQL Запрос получить значения столбцов, которые соответствуют значению MAX другого столбца? . Но друид, похоже, не поддерживает операцию MAX / MIN со строками.: - /
  2. Попытка подхода на основе ранжирования для ранжирования элементов по частоте, а затем выбрать самые высокие ранги в следующем запросе выбора. Друид не поддерживает оператор ранга.: - /

Кто-нибудь есть какие-либо идеи о том, как действовать дальше?

1 Ответ

0 голосов
/ 29 марта 2020

Обычный способ сделать это в базах данных - использовать оконные функции, которые не поддерживаются в Druid. Может работать что-то вроде следующего:

with ps as (
      select product, salebucket, count(*) as cnt
      from t
      group by product, salebucket
     )
select ps.product, ps.salebucket
from ps join
     (select ps.product, max(cnt) as max_cnt
      from ps
      group by ps.product
     ) ps2
     on ps2.product = ps.product and ps2.max_cnt = ps.cnt;

Я не уверен на 100%, что это соответствует ограничениям Друида SQL, но это может работать для вас.

...