Hive的分析函数 - rank(), row_number(), dense_rank()区别

Hive的分析函数 - rank(), row_number(), dense_rank()区别
最新回答
月影依风

2026-10-21 04:27:03

Hive中rank()、row_number()、dense_rank()函数的区别

在Hive中,rank()、row_number()和dense_rank()是三个常用的分析函数,它们用于对数据进行排序并生成相应的排名。尽管这三个函数都涉及排名,但它们在处理相同值时的行为有所不同。

一、rank()函数

  • 功能描述:rank()函数对数据进行排序时,对于相同的排序值会赋予相同的排名,并且下一个不同值的排名会跳跃。也就是说,如果存在多个相同的值,它们会共享同一个排名,而下一个不同值的排名会跳过这些共享排名的数量。

  • 示例说明:假设有一组数据,按照某个字段排序后得到以下结果(仅展示排序字段和排名结果):

    A, 1

    B, 2

    B, 2

    C, 4

    D, 5

    在这个例子中,B有两个相同的值,因此它们都被赋予排名2,而下一个不同值C的排名则跳跃到4,跳过了原本可能分配给C的排名3。

二、row_number()函数

  • 功能描述:row_number()函数按照顺序为每一行数据分配一个唯一的排名,不管排名是否有相同的值。也就是说,它会按照数据的顺序,从1开始依次递增地分配排名。

  • 示例说明:同样以上面的数据为例,使用row_number()函数进行排名会得到以下结果:

    A, 1

    B, 2

    B, 3

    C, 4

    D, 5

    在这个例子中,即使B有两个相同的值,它们也会被分别赋予不同的排名。

三、dense_rank()函数

  • 功能描述:dense_rank()函数对于排名相同的值会赋予相同的排名,且后面的排名不会跳跃。也就是说,如果存在多个相同的值,它们会共享同一个排名,而下一个不同值的排名会紧接着上一个排名之后。

  • 示例说明:以上面的数据为例,使用dense_rank()函数进行排名会得到以下结果:

    A, 1

    B, 2

    B, 2

    C, 3

    D, 4

    在这个例子中,B有两个相同的值,因此它们都被赋予排名2,而下一个不同值C的排名则紧接着上一个排名2之后,为3。

总结

  • rank():对于相同的排序值赋予相同的排名,下一个不同值的排名会跳跃。
  • row_number():按照数据的顺序依次递增地分配唯一的排名。
  • dense_rank():对于相同的排序值赋予相同的排名,且后面的排名不会跳跃。

以下是这三个函数在Hive中的使用示例以及它们生成排名的直观对比图:

(注:图片展示了三个函数在相同数据集上生成的排名结果,可以清晰地看到它们之间的区别。)

通过对比这三个函数的行为和示例,可以更加直观地理解它们在Hive中的使用场景和区别。