在大数据时代,Apache Hive 是处理和分析海量数据的强大工具。Hive 提供了丰富的聚合函数和强大的 OVER 窗口函数,能够帮助我们高效地进行数据分析。本文将综合介绍 Hive 的聚合函数和 OVER 窗口函数,结合实际使用场景和代码示例,帮助读者深入理解这些功能,尤其是它们在时间序列分析中的应用。
SELECT date, amount, SUM(amount) OVER (ORDER BY date) AS cumulative_sales
FROM sales;
示例数据:
date
amount
2024-01-01
100
2024-01-02
200
2024-01-03
300
结果展示:
date
amount
cumulative_sales
2024-01-01
100
100
2024-01-02
200
300
2024-01-03
300
600
解释:
首先按 date 列对数据进行排序。
然后使用 SUM(amount) OVER (ORDER BY date) 计算累积的 amount 总和,对于每一行,计算从第一行到当前行的 amount 总和,结果列命名为 cumulative_sales。
2.2.4 指定窗口范围
sql复制代码
SELECT date, amount, SUM(amount) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS sum_with_previous
FROM sales;
示例数据:
date
amount
2024-01-01
100
2024-01-02
200
2024-01-03
300
结果展示:
date
amount
sum_with_previous
2024-01-01
100
100
2024-01-02
200
300
2024-01-03
300
500
解释:
按 date 列排序。
ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 定义了窗口范围,包括当前行和前一行。
计算这个窗口内 amount 列的总和,结果列命名为 sum_with_previous。
三、OVER 窗口函数在时间序列分析中的应用
时间序列分析是大数据分析中的常见场景,OVER 窗口函数在处理时间序列数据时表现出色。以下是一些
常见的应用场景和示例:
3.1 累积聚合
累积聚合用于计算某个时间段内的累积值,例如累积销售额或访问量。
示例:计算每日累积销售额
sql复制代码
SELECT sales_date,
sales_amount,
SUM(sales_amount) OVER (ORDER BY sales_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales
FROM sales_data
ORDER BY sales_date;
示例数据:
sales_date
sales_amount
2024-01-01
100
2024-01-02
200
2024-01-03
300
结果展示:
sales_date
sales_amount
cumulative_sales
2024-01-01
100
100
2024-01-02
200
300
2024-01-03
300
600
解释:
按 sales_date 排序。
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 表示窗口范围从第一行开始到当前行。
SELECT sales_date,
sales_amount,
AVG(sales_amount) OVER (ORDER BY sales_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS rolling_avg_sales
FROM sales_data
ORDER BY sales_date;
示例数据:
sales_date
sales_amount
2024-01-01
100
2024-01-02
200
2024-01-03
300
2024-01-04
400
2024-01-05
500
2024-01-06
600
2024-01-07
700
结果展示:
sales_date
sales_amount
rolling_avg_sales
2024-01-01
100
100
2024-01-02
200
150
2024-01-03
300
200
2024-01-04
400
250
2024-01-05
500
300
2024-01-06
600
350
2024-01-07
700
400
解释:
按 sales_date 排序。
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 定义窗口范围为当前行及其前 6 行。
SELECT sales_date,
product_id,
sales_amount,
RANK() OVER (PARTITION BY sales_date ORDER BY sales_amount DESC) AS sales_rank
FROM sales_data
ORDER BY sales_date, sales_rank;
示例数据:
sales_date
product_id
sales_amount
2024-01-01
1
100
2024-01-01
2
200
2024-01-02
1
300
2024-01-02
2
400
结果展示:
sales_date
product_id
sales_amount
sales_rank
2024-01-01
2
200
1
2024-01-01
1
100
2
2024-01-02
2
400
1
2024-01-02
1
300
2
解释:
PARTITION BY sales_date 将数据按 sales_date 分组。
ORDER BY sales_amount DESC 在组内按 sales_amount 降序排序。
RANK() 函数为每个组内的行分配排名,结果列 sales_rank 显示排名。
3.4 时间序列的比较分析
LAG 和 LEAD 函数可以用来访问当前行的前一行或后一行的数据,这在时间序列分析中非常有用,例如计算日增长率。
示例:计算日销售额增长率
sql复制代码
SELECT sales_date,
sales_amount,
LAG(sales_amount, 1) OVER (ORDER BY sales_date) AS previous_sales,
(sales_amount - LAG(sales_amount, 1) OVER (ORDER BY sales_date)) / LAG(sales_amount, 1) OVER (ORDER BY sales_date) AS growth_rate
FROM sales_data
ORDER BY sales_date;
示例数据:
sales_date
sales_amount
2024-01-01
100
2024-01-02
200
2024-01-03
300
结果展示:
sales_date
sales_amount
previous_sales
growth_rate
2024-01-01
100
NULL
NULL
2024-01-02
200
100
1.0
2024-01-03
300
200
0.5
解释:
LAG(sales_amount, 1) OVER (ORDER BY sales_date) 获取前一行的 sales_amount。
SELECT year(sales_date) AS year,
month(sales_date) AS month,
SUM(sales_amount) AS total_sales,
AVG(sales_amount) AS avg_sales
FROM sales_data
GROUP BY year(sales_date), month(sales_date)
ORDER BY year, month;