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 от запуска к запуску, их значения порядка различны.