Apache Hive 聚合函数与 OVER 窗口函数:从基础到高级应用

news2025/1/26 17:11:23

在大数据时代,Apache Hive 是处理和分析海量数据的强大工具。Hive 提供了丰富的聚合函数和强大的 OVER 窗口函数,能够帮助我们高效地进行数据分析。本文将综合介绍 Hive 的聚合函数和 OVER 窗口函数,结合实际使用场景和代码示例,帮助读者深入理解这些功能,尤其是它们在时间序列分析中的应用。

一、Hive 聚合函数基础

聚合函数是 Hive 中用于对一组数据进行计算并返回单个值的函数。它们在数据分析中非常常见,例如计算总和、平均值、最大值、最小值等。以下是一些常用的聚合函数及其使用场景:
sales 表示例数据:

product_idad_spendamount
10110100
10220150
10130200
10340250
10250300

1.1 常用聚合函数

函数描述示例
COUNT统计行数或满足条件的行数。SELECT COUNT(*) AS total FROM users;
SUM计算数值列的总和。SELECT SUM(amount) AS total_sales FROM sales;
AVG计算数值列的平均值。SELECT AVG(amount) AS avg_sales FROM sales;
MAX返回数值列的最大值。SELECT MAX(amount) AS max_sales FROM sales;
MIN返回数值列的最小值。SELECT MIN(amount) AS min_sales FROM sales;
COUNT(DISTINCT)统计某一列中不同值的数量。SELECT COUNT(DISTINCT product_id) AS distinct_products FROM sales;

1.2 高级聚合函数

除了常用的聚合函数,Hive 还提供了一些高级聚合函数,用于更复杂的分析:

函数描述示例结果
STDDEV计算数值列的标准差,用于衡量数据的离散程度。标准差越大,数据越分散;标准差越小,数据越集中。SELECT STDDEV(amount) AS stddev_amount FROM sales;假设计算结果为约 86.6(表示 amount 列数据相对于平均值的离散程度)
VARIANCE计算数值列的方差,用于衡量数据的离散程度。方差是标准差的平方。SELECT VARIANCE(amount) AS variance_amount FROM sales;约 7500(amount 列数据的方差,为标准差 86.6 的平方)
CORR计算两个数值列之间的相关性。相关性系数的范围在 -1 到 1 之间,-1 表示完全负相关,1 表示完全正相关,0 表示无相关性。SELECT CORR(amount, id) AS correlation FROM sales;假设计算结果为约 0.8(表示 amount 列和 id 列之间存在较强的正相关关系)

STDDEV 为例,具体计算过程是先计算每个数据点与平均值的差的平方,再求这些平方值的平均值,最后对该平均值取平方根。例如,对于上述 sales 表中的 amount 列,平均值为 200,计算每个 amount 值与 200 的差的平方,再求这些平方值的平均值,最后开方得到标准差。

二、OVER 窗口函数基础

OVER 窗口函数是 Hive 中用于在保留数据明细的同时进行分组、排序和聚合计算的强大工具。它通过定义窗口范围,允许我们对数据进行更灵活的分析。以下是 OVER 窗口函数的基本语法和使用场景:

2.1 基本语法

<aggregate_function> OVER (
    [PARTITION BY <col_name>,...]
    [ORDER BY <col_name>,...]
    [ROWS <window_frame>]
)
  • <aggregate_function>:聚合函数,如 SUMAVGCOUNT 等。
  • PARTITION BY:按指定列分组。
  • ORDER BY:在分组内按指定列排序。
  • ROWS:定义窗口范围。

2.2 使用场景

2.2.1 全表聚合
SELECT id, amount, SUM(amount) OVER () AS total_sales
FROM sales;
  • 示例数据:
idamount
1100
2200
3300
  • 结果展示:
idamounttotal_sales
1100600
2200600
3300600
  • 解释:
    • 该查询使用 SUM(amount) OVER () 进行全表聚合,计算 amount 列的总和。
    • 对于 sales 表中的每一行,都会计算出 amount 列的总和,结果列命名为 total_sales
2.2.2 分组聚合
SELECT region, amount, SUM(amount) OVER (PARTITION BY region) AS region_total_sales
FROM sales;
  • 示例数据:
regionamount
North100
North200
South300
South400
  • 结果展示:
regionamountregion_total_sales
North100300
North200300
South300700
South400700
  • 解释:
    • 使用 PARTITION BY region 将数据按 region 分组。
    • 对于每个组,使用 SUM(amount) 计算该组内 amount 列的总和,结果列命名为 region_total_sales
2.2.3 排序聚合
SELECT date, amount, SUM(amount) OVER (ORDER BY date) AS cumulative_sales
FROM sales;
  • 示例数据:
dateamount
2024-01-01100
2024-01-02200
2024-01-03300
  • 结果展示:
dateamountcumulative_sales
2024-01-01100100
2024-01-02200300
2024-01-03300600
  • 解释:
    • 首先按 date 列对数据进行排序。
    • 然后使用 SUM(amount) OVER (ORDER BY date) 计算累积的 amount 总和,对于每一行,计算从第一行到当前行的 amount 总和,结果列命名为 cumulative_sales
2.2.4 指定窗口范围
SELECT date, amount, SUM(amount) OVER (ORDER BY date ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS sum_with_previous
FROM sales;
  • 示例数据:
dateamount
2024-01-01100
2024-01-02200
2024-01-03300
  • 结果展示:
dateamountsum_with_previous
2024-01-01100100
2024-01-02200300
2024-01-03300500
  • 解释:
    • date 列排序。
    • ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 定义了窗口范围,包括当前行和前一行。
    • 计算这个窗口内 amount 列的总和,结果列命名为 sum_with_previous

三、OVER 窗口函数在时间序列分析中的应用

时间序列分析是大数据分析中的常见场景,OVER 窗口函数在处理时间序列数据时表现出色。以下是一些
常见的应用场景和示例:

3.1 累积聚合

累积聚合用于计算某个时间段内的累积值,例如累积销售额或访问量。

示例:计算每日累积销售额

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_datesales_amount
2024-01-01100
2024-01-02200
2024-01-03300
  • 结果展示:
sales_datesales_amountcumulative_sales
2024-01-01100100
2024-01-02200300
2024-01-03300600
  • 解释:
    • sales_date 排序。
    • ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 表示窗口范围从第一行开始到当前行。
    • 计算 sales_amount 的累积总和,结果列 cumulative_sales 显示了从第一行到当前行的 sales_amount 累积值。

3.2 滑动窗口聚合

滑动窗口聚合用于计算某个固定时间段内的聚合值,例如过去7天的平均销售额。

示例:计算过去7天的平均销售额

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_datesales_amount
2024-01-01100
2024-01-02200
2024-01-03300
2024-01-04400
2024-01-05500
2024-01-06600
2024-01-07700
  • 结果展示:
sales_datesales_amountrolling_avg_sales
2024-01-01100100
2024-01-02200150
2024-01-03300200
2024-01-04400250
2024-01-05500300
2024-01-06600350
2024-01-07700400
  • 解释:
    • sales_date 排序。
    • ROWS BETWEEN 6 PRECEDING AND CURRENT ROW 定义窗口范围为当前行及其前 6 行。
    • 计算该窗口内 sales_amount 的平均值,结果列 rolling_avg_sales 显示过去 7 天(包括当前行)的平均销售额。

3.3 时间序列的排名分析

排名分析用于了解某个指标在不同时间点的相对位置。

示例:按日期对销售额进行排名

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_dateproduct_idsales_amount
2024-01-011100
2024-01-012200
2024-01-021300
2024-01-022400
  • 结果展示:
sales_dateproduct_idsales_amountsales_rank
2024-01-0122001
2024-01-0111002
2024-01-0224001
2024-01-0213002
  • 解释:
    • PARTITION BY sales_date 将数据按 sales_date 分组。
    • ORDER BY sales_amount DESC 在组内按 sales_amount 降序排序。
    • RANK() 函数为每个组内的行分配排名,结果列 sales_rank 显示排名。

3.4 时间序列的比较分析

LAGLEAD 函数可以用来访问当前行的前一行或后一行的数据,这在时间序列分析中非常有用,例如计算日增长率。

示例:计算日销售额增长率

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_datesales_amount
2024-01-01100
2024-01-02200
2024-01-03300
  • 结果展示:
sales_datesales_amountprevious_salesgrowth_rate
2024-01-01100NULLNULL
2024-01-022001001.0
2024-01-033002000.5
  • 解释:
    • LAG(sales_amount, 1) OVER (ORDER BY sales_date) 获取前一行的 sales_amount
    • 计算当前行 sales_amount 与前一行 sales_amount 的差值,再除以前一行 sales_amount 得到增长率 growth_rate

3.5 时间序列的分组聚合

按时间段(如月、季度)对数据进行分组聚合是时间序列分析中的常见需求。

示例:按月计算销售额和平均销售额

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;
  • 示例数据:
sales_datesales_amount
2024-01-01100
2024-01-15200
2024-02-01300
2024-02-20400
  • 结果展示:
yearmonthtotal_salesavg_sales
20241300150
20242700350
  • 解释:
    • 使用 year(sales_date)month(sales_date) 提取年份和月份。
    • 按年份和月份分组,使用 SUM(sales_amount) 计算每月的总销售额,AVG(sales_amount) 计算每月的平均销售额。

四、优化技巧

在处理大规模数据时,优化查询性能至关重要。以下是一些优化技巧:

  • 合理使用分区和分桶:通过分区和分桶,可以将数据分割成更小的块,提高查询效率。
  • 避免过多的嵌套查询:尽量将复杂的查询逻辑分解成多个简单的查询,减少计算量。
  • 使用物化视图:对于频繁使用的聚合查询,可以创建物化视图,提前计算结果,提高查询速度

五、总结

Apache Hive 的聚合函数和 OVER 窗口函数是大数据分析的核心工具。通过本文的介绍,我们详细探讨了这些功能的使用场景和代码示例,尤其是它们在时间序列分析中的强大能力。无论是简单的统计分析,还是复杂的多维度汇总,Hive 都能帮助我们高效地完成任务。

希望本文能够帮助读者更好地掌握 Hive 的聚合函数和 OVER 窗口函数,提升数据分析能力。如果你对 Hive 有更多问题,或者想了解更多高级用法,欢迎在评论区留言,我们一起探讨!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2282908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL基础、函数、约束(MySQL第二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 SQL通用语法SQL数据类型SQL语句分类DDL数据库操作表操作-查询&创建典例表操作-修改字段表操作-改名&删除 DMLDML-插入(添加)数据DML-更新(修改)数据DML-删除数据 DQL基本…

hash路由、history路由

hash路由 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>h…

unity 粒子系统实现碰撞检测(collision)且使粒子不受力

需求&#xff1a;通过碰撞检测的方式&#xff0c;获得粒子碰撞到的物体&#xff0c;并且碰撞之后&#xff0c;粒子的运动方向&#xff0c;旋转等物理性质都保持不变 为什么不用trigger&#xff1f;因为trigger虽然不会使粒子受力&#xff0c;但是在触发回调函数中&#xff0c;…

金融级分布式数据库如何优化?PawSQL发布OceanBase专项调优指南

前言 OceanBase数据库作为国产自主可控的分布式数据库&#xff0c;在金融、电商、政务等领域得到广泛应用&#xff0c;优化OceanBase数据库的查询性能变得愈发重要。PawSQL为OceanBase数据库提供了全方位的SQL性能优化支持&#xff0c;助力用户充分发挥OceanBase数据库的性能潜…

Anaconda安装及使用

文章目录 Anaconda安装关于PyTorch的安装和使用Frequently Asked Questions 在PyCharm中使用PyTorchapex库的安装 声明&#xff1a;以下内容均是根据个人经验总结&#xff0c;可能存在不合理之处&#xff0c;烦请指正。 Anaconda安装 打开Anaconda Prompt 输入&#xff1a;cond…

Prometheus+Grafana监控minio对象存储

1. 安装 MinIO 步骤 1&#xff1a;下载 MinIO 二进制文件 wget https://dl.min.io/server/minio/release/linux-amd64/miniochmod x miniosudo mv minio /usr/local/bin/ 步骤 2&#xff1a;创建数据目录 sudo mkdir -p /data/miniosudo chown -R $USER:$USER /data/minio …

使用Cline+deepseek实现VsCode自动化编程

不知道大家有没有听说过cursor这个工具&#xff0c;类似于AIVsCode的结合体&#xff0c;只要绑定chatgpt、claude等大模型API&#xff0c;就可以实现对话式自助编程&#xff0c;简单闲聊几句便可开发一个软件应用。 但cursor受限于外网&#xff0c;国内用户玩不了&#xff0c;…

[云讷科技]Kerloud Falcon四旋翼飞车虚拟仿真空间发布

虚拟仿真环境作为一个独立的专有软件包提供给我们的客户&#xff0c;用于帮助用户在实际测试之前验证自身的代码&#xff0c;并通过在仿真引擎中添加新的场景来探索新的飞行驾驶功能。 环境要求 由于环境依赖关系&#xff0c;虚拟仿真只能运行在装有Ubuntu 18.04的Intel-64位…

前缀和——连续数组

一.题目描述 525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 让我们找到一个最长的数组&#xff0c;里面的0&#xff0c;1个数是相等的。 这道题依旧不能用滑动窗口解决&#xff0c;因为找到满足的之后&#xff0c;需要继续遍历。 我们可以对数组进行转…

QT 通过ODBC连接数据库的好方法:

效果图&#xff1a; PWD使用自己的&#xff0c;我的这是自己的&#xff0c;所以你用不了。 以下是格式。 // 1. 设置数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QODBC");// 建立和QMYSQL数据库的连接 // 设置数据库连接名称&#xff08;DSN&am…

数字MIC PDM接口

在音频采样中&#xff0c;我们经常会用到PCM&#xff0c;PDM这种方式&#xff0c;它们之间也是有一些区别的。 &#xff11;&#xff1a;PDM 工作原理&#xff1a; PDM使用远高于PCM采样率的时钟采样调制模拟分量&#xff0c;每次采样结果只有1位输出&#xff08;0或1&…

SpringBoot--基本使用(配置、整合SpringMVC、Druid、Mybatis、基础特性)

这里写目录标题 一.介绍1.为什么依赖不需要写版本&#xff1f;2.启动器(Starter)是何方神圣&#xff1f;3.SpringBootApplication注解的功效&#xff1f;4.启动源码5.如何学好SpringBoot 二.SpringBoot3配置文件2.1属性配置文件使用2.2 YAML配置文件使用2.3 YAML配置文件使用2.…

vim如何设置显示空白符

:set list 显示空白符 示例&#xff1a; :set nolist 不显示空白符 示例&#xff1a; &#xff08;vim如何使设置显示空白符永久生效&#xff1a;vim如何使相关设置永久生效-CSDN博客&#xff09;

常用集合-数据结构-MySql

目录 java核心&#xff1a; 常用集合与数据结构: 单例集合: 双列集合: 线程安全的集合: ConcurrentHashMap集合: HashTable集合: CopyOnWriteArrayList集合: CopyOnWriteArraySet集合: ConcurrentLinkedQueue队列: ConcurrentSkipListMap和ConcurrentSkipListSet&…

Android BitmapShader简洁实现马赛克,Kotlin(二)

Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;二&#xff09; 这一篇 Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;一&#xff09;-CSDN博客 遗留一个问题&#xff0c;xml定义的MyView为wrap_content的宽高&#xff0c;如果改成其…

HarmonyOS基于ArkTS卡片服务

卡片服务 前言 Form Kit&#xff08;卡片开发框架&#xff09;提供了一种在桌面、锁屏等系统入口嵌入显示应用信息的开发框架和API&#xff0c;可以将应用内用户关注的重要信息或常用操作抽取到服务卡片&#xff08;以下简称“卡片”&#xff09;上&#xff0c;通过将卡片添加…

缓存之美:万文详解 Caffeine 实现原理(上)

由于社区最大字数限制&#xff0c;本文章将分为两篇&#xff0c;第二篇文章为缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;下&#xff09; 大家好&#xff0c;我是 方圆。文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍&…

C# 多线程同步(Mutex | Semaphore)

Mutex: 用于保护临界区&#xff0c;确保同一时间只有一个线程能够访问共享资源&#xff1b; Semaphore: 允许同时有多个线程访问共享资源&#xff0c;但会限制并发访问的数量。 Mutex运行输出 Semaphore运行输出 namespace SyncThreadDemo {internal class Program{static stri…

C++从入门到实战(二)C++命名空间

C从入门到实战&#xff08;二&#xff09;C命名空间 前言一、C的第一个程序二、命名空间&#xff08;一&#xff09;为什么需要命名空间&#xff08;二&#xff09;定义命名空间&#xff08;三&#xff09;使用命名空间1.通过命名空间限定符&#xff1a;2.使用 using 声明&…

广西螺蛳粉:舌尖上的美食传奇

广西螺蛳粉:舌尖上的美食传奇 在广西壮族自治区,有一种小吃以其独特的酸辣鲜香和丰富的历史文化底蕴,成为了无数食客心中的美食传奇——这就是广西螺蛳粉。 一、历史渊源 螺蛳粉最早出现于20世纪70年代末的柳州市,是柳州人民对美食的创新与智慧的结晶。早在40多年前,大量的螺…