Есть ли функция, эквивалентная функции «процентиль» Hive в Impala? В основном я пытаюсь найти процентили для набора строк в моей таблице. Я попытался использовать функцию процентилей с моим запросом в Hive, но выполнение запроса и возврат результата занимает много времени.
Функция, эквивалентная процентилю в импале
Ответы (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
person
Gordon Linoff
schedule
17.11.2020
Спасибо, Гордон Линофф. Я получаю сообщение об ошибке AnalysisException: выберите выражение списка, не созданное выводом агрегации (отсутствует в предложении GROUP BY?): row_number() OVER (ORDER BY day1diff ASC) seqnum, когда я пытаюсь выполнить самый внутренний запрос.
- person Pushpa Gadde; 17.11.2020
@PushpaGadde . . . Это странное сообщение об ошибке. В этом запросе нет агрегации.
- person Gordon Linoff; 17.11.2020
У меня недостаточно репутации, чтобы комментировать, поэтому я публикую ответ. Ответ Гордона Линоффа дает очень хорошее решение. Если в разделе есть только один элемент (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
person
phantomias
schedule
04.02.2021