配置单元中的sql窗口函数

4dbbbstv  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(423)

我正在探索hive中的窗口功能,我能够理解所有udf的功能。虽然,我不能理解我们与其他函数一起使用的分区方式和顺序方式。下面的结构与我计划构建的查询非常相似。

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

只是想了解这两个关键字的背景过程。
感谢您的帮助:)

9vw9lbht

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开始。
示例(行已在分区内分区和排序):

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 将为上述数据集中的第三行生成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 条款。在这种情况下,所有行从一个运行到另一个运行总是有相同的行号,它们的顺序值是不同的。

相关问题