RANK() 分析函数为数据集中每个分区中的每一行分配一个秩。 PARTITION BY 子句确定如何分配行(如果是配置单元,则在异径管之间)。 ORDER BY 确定如何在分区中对行进行排序。 第一个阶段是distribute by,数据集中的所有行都被分配到分区中。在map中,每个mapper根据 partition by 并为每个分区生成文件。Map器根据 order by . 第二阶段,在每个分区内对所有行进行排序。在mapreduce中,每个reducer获取由Map程序生成的分区文件(分区的一部分),并根据 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
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 条款。在这种情况下,所有行从一个运行到另一个运行总是有相同的行号,它们的顺序值是不同的。
1条答案
按热度按时间9vw9lbht1#
RANK()
分析函数为数据集中每个分区中的每一行分配一个秩。PARTITION BY
子句确定如何分配行(如果是配置单元,则在异径管之间)。ORDER BY
确定如何在分区中对行进行排序。第一个阶段是distribute by,数据集中的所有行都被分配到分区中。在map中,每个mapper根据
partition by
并为每个分区生成文件。Map器根据order by
.第二阶段,在每个分区内对所有行进行排序。在mapreduce中,每个reducer获取由Map程序生成的分区文件(分区的一部分),并根据
order by
.第三,秩函数为分区中的每一行分配秩。正在为每个分区初始化秩函数。
对于分区中的第一行,列从1开始。对于下一行
Rank=previous row rank+1
. 具有相等值(按顺序指定)的行给定相同的秩,如果这两行共享相同的秩,则下一行秩不是连续的。不同的分区可以在不同的减速器上并行处理。小分区可以在同一个减速机上加工。秩函数在越过分区边界时重新初始化,并从每个分区的秩=1开始。
示例(行已在分区内分区和排序):
如果需要连续排列,请使用
dense_rank
功能。dense_rank
将为上述数据集中的第三行生成rank=2。row_number
函数将为分区中的每一行分配一个位置号,从1开始。具有相等值的行将接收不同的连续数字。重要提示:对于具有相同值的行
row_number
或者其他这样的分析函数可能具有不确定性行为,并且在运行之间产生不同的数字。上述数据集中的第一行可能会收到数字2,第二行可能会收到数字1,反之亦然,因为它们的顺序是不确定的,除非您将在数据集中再添加一列aorder by
条款。在这种情况下,所有行从一个运行到另一个运行总是有相同的行号,它们的顺序值是不同的。