Оконная функция в Hive - PullRequest
2 голосов
/ 29 апреля 2019

Я изучаю функции управления окнами в Hive и могу понять функциональные возможности всех пользовательских функций.Хотя я не могу понять разделение и порядок, который мы используем с другими функциями.Ниже приведена структура, которая очень похожа на запрос, который я планирую построить.

SELECT a, RANK() OVER(partition by b order by c) as d from xyz; 

Просто пытаюсь понять фоновый процесс, связанный с обоими ключевыми словами.

Оцените помощь :)

1 Ответ

4 голосов
/ 29 апреля 2019

RANK() аналитическая функция присваивает ранг каждой строке в каждом разделе набора данных.

PARTITION BY Предложение определяет, как должны быть распределены строки (между редукторами, если это куст).

ORDER BY определяет порядок сортировки строк в разделе.

Первый этап распределяется по , все строки в наборе данных распределяются по разделам.В map-limit каждый маппер группирует строки в соответствии с partition by и создает файлы для каждого раздела.Mapper выполняет начальную сортировку частей раздела.

Второй этап , все строки сортируются внутри каждого раздела.В картографическом сокращении каждый редуктор получает файлы разделов (части разделов), создаваемые средствами отображения, и сортирует строки во всем разделе (вид частичных результатов) согласно order by.

Третий , функция ранга присваивает ранг каждой строке в разделе.Функция ранга инициализируется для каждого раздела.

Для первой строки ранга раздела начинается с 1. Для каждой следующей строки Rank=previous row rank+1.Строки с одинаковыми значениями (указанными в порядке) с одинаковым рангом, если две строки имеют одинаковый ранг, ранг следующей строки не является последовательным.

Различные разделы могут обрабатываться параллельно на разных редукторах.Небольшие перегородки можно обрабатывать на одном и том же редукторе.Функция ранга переинициализируется при пересечении границы раздела и начинается с ранга = 1 для каждого раздела.

Пример (строки уже разделены и отсортированы внутри разделов):

SELECT a, RANK() OVER(partition by b order by c) as d from xyz; 

a, b, c, d(rank)
----------------
1  1  1  1 --starts with 1
2  1  1  1 --the same c value, the same rank=1
3  1  2  3 --rank 2 is skipped because second row shares the same rank as first 

4  2  3  1 --New partition starts with 1
5  2  4  2
6  2  5  3

Если вынужны последовательные ранги, используйте функцию dense_rank.dense_rank даст ранг = 2 для третьей строки в указанном наборе данных.

row_number функция назначит номер позиции каждой строке в разделе, начиная с 1. Строки с одинаковыми значениями получат разные последовательные номера.

SELECT a, ROW_NUMBER() OVER(partition by b order by c) as d from xyz; 

a, b, c, d(row_number)
----------------
1  1  1  1 --starts with 1
2  1  1  2 --the same c value, row number=2
3  1  2  3 --row position=3

4  2  3  1 --New partition starts with 1
5  2  4  2
6  2  5  3

Важное примечание: Для строк с одинаковыми значениями row_number или другой такой аналитической функции может иметь недетерминированное поведение и производить разные числа от прогона к прогону.Первая строка в указанном выше наборе данных может получить номер 2, а вторая строка может получить номер 1 и наоборот, поскольку их порядок не определен, если вы не добавите еще один столбец a к предложению order by.В этом случае все строки всегда будут иметь один и тот же row_number от запуска к запуску, их значения порядка различны.

...