Hive 中的窗口函数允许你在结果集的一个特定"窗口"内对行进行计算。这些窗口可以是物理的(基于行在数据中的实际位置)或逻辑的(基于行的一些排序标准)。窗口函数在处理排名、计算累计和或计算移动平均值等问题时特别有用。
以下是一些 Hive 中的常见窗口函数:
-
ROW_NUMBER()
- 为窗口中的每一行分配一个唯一的整数编号。
- 示例:
ROW_NUMBER() OVER (ORDER BY column_name)
-
RANK()
- 为窗口中的每一行分配一个唯一的排名,对于并列的值会有相同的排名,并且会留下一些排名的间隙。
- 示例:
RANK() OVER (ORDER BY column_name)
-
DENSE_RANK()
- 与 RANK() 类似,但不会留下排名间隙。
- 示例:
DENSE_RANK() OVER (ORDER BY column_name)
-
NTILE(n)
- 将窗口中的行分成指定数量的近似相等的组,并为每一行返回其组号。
- 示例:
NTILE(4) OVER (ORDER BY column_name)
-
LAG(column, n, default)
- 返回当前行之前的第 n 行的指定列的值。如果不存在这样的行,则返回默认值。
- 示例:
LAG(column_name, 1, 0) OVER (ORDER BY another_column)
-
LEAD(column, n, default)
- 返回当前行之后的第 n 行的指定列的值。如果不存在这样的行,则返回默认值。
- 示例:
LEAD(column_name, 1, 0) OVER (ORDER BY another_column)
-
FIRST_VALUE(column)
- 返回窗口中的第一行的指定列的值。
- 示例:
FIRST_VALUE(column_name) OVER (ORDER BY another_column)
-
LAST_VALUE(column)
- 返回窗口中的最后一行的指定列的值。
- 示例:
LAST_VALUE(column_name) OVER (ORDER BY another_column ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
注意:在使用 LAST_VALUE()
时,通常需要指定窗口范围,因为默认窗口可能不会包括所有行。
-
SUM(), AVG(), MIN(), MAX()
- 这些聚合函数也可以与窗口一起使用,以在窗口上执行计算,而不是在整个结果集上执行。
- 示例:
SUM(column_name) OVER (ORDER BY another_column ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)
这只是 Hive 中窗口函数的一个简短列表。当与其他 SQL 功能(如分区、排序和子查询)结合使用时,窗口函数可以非常强大。