gpt4 book ai didi

sql - Hive 中的窗口函数

转载 作者:行者123 更新时间:2023-12-03 18:44:59 27 4
gpt4 key购买 nike

我正在 Hive 中探索窗口函数,并且能够理解所有 UDF 的功能。虽然,我无法理解我们与其他函数一起使用的分区依据和排序依据。以下是与我计划构建的查询非常相似的结构。

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

只是想了解这两个关键字所涉及的后台过程。

感谢帮助:)

最佳答案

RANK()分析函数为数据集中每个分区中的每一行分配一个等级。
PARTITION BY子句确定如何分配行(如果是配置单元,则在 reducer 之间)。
ORDER BY确定行在分区中的排序方式。

第一阶段由 分发,数据集中的所有行都分布在分区中。在 map-reduce 中,每个映射器根据 partition by 对行进行分组并为每个分区生成文件。 Mapper 根据 order by 对分区部分进行初始排序.

二期 ,所有行都在每个分区内排序。
在map-reduce中,每个reducer获取mapper产生的分区文件(partitions的一部分),并根据order by对整个分区中的行进行排序(部分结果的排序)。 .

第三 , rank 函数为分区中的每一行分配等级。正在为每个分区初始化 Rank 函数。

对于分区等级中的第一行,从 1 开始。对于下一行 Rank=previous row rank+1 .具有相同值(按顺序指定)的行给予相同的排名,如果两行共享相同的排名,则下一行排名不连续。

不同的分区可以在不同的 reducer 上并行处理。小分区可以在同一个reducer上处理。 Rank 函数在跨越分区边界时重新初始化,并从每个分区的 rank=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,反之亦然,因为它们的顺序是不确定的,除非您再添加一列 order by条款。在这种情况下,从运行到运行,所有行将始终具有相同的 row_number,它们的顺序值不同。

关于sql - Hive 中的窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909029/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com