#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 /…