Функция, эквивалентная процентилю в impala

#sql #impala #percentile

#sql #impala #процентиль

Вопрос:

Существует ли функция, эквивалентная функции Hive ‘percentile’ в Impala? Я в основном пытаюсь найти процентили для набора строк в моей таблице. Я попытался использовать функцию процентиля с моим запросом в Hive, но выполнение запроса и возврат результата занимают много времени.

Ответ №1:

У меня недостаточно репутации для комментариев, поэтому я публикую ответ. Ответ Гордона Линоффа предоставляет очень хорошее решение. Если в разделе есть только один элемент (cnt = 1), процентиль возвращает значение NULL. В случае, если нужно вернуть значение этого единственного элемента, может помочь небольшое расширение решения Gordons. (Фрагмент кода также содержит разделы по столбцу).

 select group_column,
   max(case when (cnt > 1 and seqnum <= p * cnt) or cnt = 1 then XXX end) 
   as percentile 
from (select t.*,
         row_number() over (partition by group_column order by XXX) as seqnum,
         count(*) over (partition by group_column) as cnt
  from t) a
group by group_column
  

Ответ №2:

Вы можете использовать подзапрос и арифметику. Например:

 select t.*,
       max(case when seqnum <= p * cnt then XXX end) over () as percentile
from (select t.*,
             row_number() over (order by XXX) as seqnum,
             count(*) over () as cnt
      from t
     ) t
  

Комментарии:

1. Спасибо, Гордон Линофф. При попытке выполнить самый внутренний запрос я получаю сообщение об ошибке «AnalysisException: выражение списка выбора, не созданное путем агрегирования (отсутствует в предложении GROUP BY?): row_number() OVER (ORDER BY day1diff ASC) seqnum.

2. @PushpaGadde . . . Это странное сообщение об ошибке. В этом запросе нет агрегации.

3. Я считаю, что max и count считаются агрегацией. impala.apache.org/docs/build/html/topics /…