🍋🍋大数据学习🍋🍋
🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
在 Apache Hive 中,窗口函数(Window Functions)是一类强大的 SQL 函数,用于对查询结果集的一个“窗口”或“分组”进行计算,而不减少结果集的行数。以下是 Hive 中常用的窗口函数分类及示例:
1. 排名函数
函数 | 描述 |
---|---|
ROW_NUMBER() | 为结果集中的每一行分配一个唯一的行号,行号从 1 开始。 |
RANK() | 为结果集中的每一行分配一个排名,遇到相同值时跳过排名。 |
DENSE_RANK() | 为结果集中的每一行分配一个排名,遇到相同值时不跳过排名。 |
NTILE(n) | 将结果集划分为 n 个桶,并为每一行分配一个桶号。 |
示例
SELECT
employee_id,
salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_in_department,
DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank_in_department,
ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_number_in_department
FROM employees;
2. 聚合函数(作为窗口函数)
函数 | 描述 |
---|---|
SUM() | 计算窗口内数值的总和。 |
AVG() | 计算窗口内数值的平均值。 |
MIN() | 返回窗口内的最小值。 |
MAX() | 返回窗口内的最大值。 |
COUNT() | 计算窗口内的行数。 |
SELECT
employee_id,
department_id,
salary,
SUM(salary) OVER (PARTITION BY department_id) AS total_salary_in_department,
AVG(salary) OVER (PARTITION BY department_id) AS avg_salary_in_department
FROM employees;
3. 分析函数
函数 | 描述 |
---|---|
LAG(column, n, default) | 返回当前行之前第 n 行的值,如果超出范围则返回 default 。 |
LEAD(column, n, default) | 返回当前行之后第 n 行的值,如果超出范围则返回 default 。 |
FIRST_VALUE(column) | 返回窗口内第一行的值。 |
LAST_VALUE(column) | 返回窗口内最后一行的值(需结合 ROWS BETWEEN 子句使用)。 |
NTH_VALUE(column, n) | 返回窗口内第 n 行的值。 |
SELECT
employee_id,
salary,
LAG(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary) AS prev_salary,
LEAD(salary, 1, 0) OVER (PARTITION BY department_id ORDER BY salary) AS next_salary,
FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary) AS first_salary_in_department
FROM employees;
4. 累积函数
函数 | 描述 |
---|---|
CUME_DIST() | 计算当前行在窗口内的累积分布(小于等于当前值的比例)。 |
PERCENT_RANK() | 计算当前行在窗口内的百分比排名。 |
SELECT
employee_id,
salary,
CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) AS cume_dist_in_department,
PERCENT_RANK() OVER (PARTITION BY department_id ORDER BY salary) AS percent_rank_in_department
FROM employees;
5. 窗口定义
窗口函数通常与 OVER
子句一起使用,OVER
子句定义了窗口的范围和排序方式。
OVER (
[PARTITION BY column1, column2, ...]
[ORDER BY column3 [ASC|DESC], column4 [ASC|DESC], ...]
[ROWS|RANGE BETWEEN ... AND ...]
)
PARTITION BY
:将结果集划分为多个分区,窗口函数在每个分区内独立计算。ORDER BY
:定义窗口内的排序顺序。ROWS|RANGE BETWEEN
:定义窗口的边界(可选)。
SELECT
employee_id,
salary,
SUM(salary) OVER (
PARTITION BY department_id
ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS cumulative_salary_in_department
FROM employees;
6. 窗口边界
UNBOUNDED PRECEDING
:窗口从分区的第一行开始。UNBOUNDED FOLLOWING
:窗口到分区的最后一行结束。CURRENT ROW
:窗口仅包含当前行。n PRECEDING
:窗口包含当前行之前的n
行。n FOLLOWING
:窗口包含当前行之后的n
行。
SELECT
employee_id,
salary,
AVG(salary) OVER (
PARTITION BY department_id
ORDER BY hire_date
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
) AS moving_avg_salary_in_department
FROM employees;
总结
Hive 中的窗口函数为数据分析提供了强大的工具,可以用于排名、聚合、累积计算、前后值比较等操作。常见的窗口函数包括:
- 排名函数:
ROW_NUMBER()
、RANK()
、DENSE_RANK()
、NTILE()
- 聚合函数:
SUM()
、AVG()
、MIN()
、MAX()
、COUNT()
- 分析函数:
LAG()
、LEAD()
、FIRST_VALUE()
、LAST_VALUE()
、NTH_VALUE()
- 累积函数:
CUME_DIST()
、PERCENT_RANK()