hive窗口分析函数使用详解系列一
1.综述
Hive的聚合函数衍生的窗口函数在我们进行数据处理和数据分析过程中起到了很大的作用
在Hive中,窗口函数允许你在结果集的行上进行计算,这些计算不会影响你查询的结果集的行数。
Hive提供的窗口和分析函数可以分为聚合函数类窗口函数,分组排序类窗口函数,偏移量计算类窗口函数。
本节主要介绍聚合函数类窗口函数的常见使用场景。
1.1.常见聚合类开窗函数
count() over();
sum() over();
max() over();
min() over();
avg() over();
1.2.分析函数语法
分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)
具体解析
over()括号内为空时,是直接进行聚合计算。
其中partition by 列名 是按指定列进行分组,进而进行聚合计算。
最后的order by 列名 是按照指定列进行排序,进而进行聚合计算。
1.3.基础数据准备
create table if not exists temp.user_info (
`id` bigint comment '用户id',
`client` string comment '客户端',
`gender` int comment '性别,0女1男',
`constellation` string comment '星座',
`age` int comment '年龄',
`pv` bigint comment '访问量',
`chat_num` bigint comment '聊天次数'
) comment '用户信息测试临时表'
数据预览
| id | client | gender | constellation | age | pv | chat_num |
|---|---|---|---|---|---|---|
| 1 | ios | 0 | 处女座 | 29 | 174 | 3 |
| 2 | ios | 1 | 双鱼座 | 26 | 263 | 2 |
| 3 | android | 1 | 双鱼座 | 35 | 232 | 39 |
| 4 | ios | 1 | 水瓶座 | 32 | 57 | 3 |
| 5 | ios | 1 | 射手座 | 33 | 67 | 6 |
| 6 | ios | 1 | 双子座 | 36 | 81 | 5 |
| 7 | ios | 1 | 狮子座 | 29 | 68 | 4 |
| 8 | ios | 1 | 狮子座 | 28 | 19 | 3 |
| 9 | ios | 0 | 射手座 | 32 | 479 | 2 |
| 10 | ios | 1 | 白羊座 | 26 | 255 | 36 |
2.over窗口为空时的计算
over()括号内为空的计算比较简单,主要应用场景为保留数据明细的同时,增加额外的列进行数据聚合计算。
1.1.sum求解总访问量总和及用户明细列表。
-- over()括号内为空时,是直接进行聚合计算
select id,client,gender,age,pv,sum(pv) over() as total_pv from temp.user_info where id <= 10
order by id
数据结果
| id | client | gender | age | pv | total_pv |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 1695 |
| 2 | ios | 1 | 26 | 263 | 1695 |
| 3 | android | 1 | 35 | 232 | 1695 |
| 4 | ios | 1 | 32 | 57 | 1695 |
| 5 | ios | 1 | 33 | 67 | 1695 |
| 6 | ios | 1 | 36 | 81 | 1695 |
| 7 | ios | 1 | 29 | 68 | 1695 |
| 8 | ios | 1 | 28 | 19 | 1695 |
| 9 | ios | 0 | 32 | 479 | 1695 |
| 10 | ios | 1 | 26 | 255 | 1695 |
可以看到给出了数据明细,并且在每行明细后增加了累积求和值。
1.2.count查询用户总量及用户明细列表。
select id,client,gender,age,pv,count(id) over() as total_count from temp.user_info where id <= 10
order by id
数据结果
| id | client | gender | age | pv | total_count |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 10 |
| 2 | ios | 1 | 26 | 263 | 10 |
| 3 | android | 1 | 35 | 232 | 10 |
| 4 | ios | 1 | 32 | 57 | 10 |
| 5 | ios | 1 | 33 | 67 | 10 |
| 6 | ios | 1 | 36 | 81 | 10 |
| 7 | ios | 1 | 29 | 68 | 10 |
| 8 | ios | 1 | 28 | 19 | 10 |
| 9 | ios | 0 | 32 | 479 | 10 |
| 10 | ios | 1 | 26 | 255 | 10 |
给出了数据明细,并且在明细后增加了当前总用户数。
1.3.max查询用户最大访问量及用户明细
-- max()查询用户最大访问量及用户明细
select id,client,gender,age,pv,max(pv) over() as max_pv from temp.user_info where id <= 10
order by id
数据结果
| id | client | gender | age | pv | max_pv |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 479 |
| 2 | ios | 1 | 26 | 263 | 479 |
| 3 | android | 1 | 35 | 232 | 479 |
| 4 | ios | 1 | 32 | 57 | 479 |
| 5 | ios | 1 | 33 | 67 | 479 |
| 6 | ios | 1 | 36 | 81 | 479 |
| 7 | ios | 1 | 29 | 68 | 479 |
| 8 | ios | 1 | 28 | 19 | 479 |
| 9 | ios | 0 | 32 | 479 | 479 |
| 10 | ios | 1 | 26 | 255 | 479 |
给出了数据明细,并在最后列增加了用户最大访问量数据
min() 同理
1.4.avg查询用户平均访问量及用户明细
select id,client,gender,age,pv,avg(pv) over() as avg_pv from temp.user_info where id <= 10
order by id
数据结果
| id | client | gender | age | pv | avg_pv |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 169.5 |
| 2 | ios | 1 | 26 | 263 | 169.5 |
| 3 | android | 1 | 35 | 232 | 169.5 |
| 4 | ios | 1 | 32 | 57 | 169.5 |
| 5 | ios | 1 | 33 | 67 | 169.5 |
| 6 | ios | 1 | 36 | 81 | 169.5 |
| 7 | ios | 1 | 29 | 68 | 169.5 |
| 8 | ios | 1 | 28 | 19 | 169.5 |
| 9 | ios | 0 | 32 | 479 | 169.5 |
| 10 | ios | 1 | 26 | 255 | 169.5 |
给出了数据明细,并在最后列增加了用户平均访问量。
2.指定列进行分组的聚合计算
2.1.sum求解不同年龄段总访问量总和及用户明细
select *,sum(pv) over(partition by age) as total_pv from temp.user_info where id <= 10
order by age
数据结果
| id | client | gender | age | pv | avg_pv |
|---|---|---|---|---|---|
| 2 | ios | 1 | 26 | 263 | 518 |
| 10 | ios | 1 | 26 | 255 | 518 |
| 8 | ios | 1 | 28 | 19 | 19 |
| 1 | ios | 0 | 29 | 174 | 242 |
| 7 | ios | 1 | 29 | 68 | 242 |
| 4 | ios | 1 | 32 | 57 | 536 |
| 9 | ios | 0 | 32 | 479 | 536 |
| 5 | ios | 1 | 33 | 67 | 67 |
| 3 | android | 1 | 35 | 232 | 232 |
| 6 | ios | 1 | 36 | 81 | 81 |
可以看到最后的total_pv 是按照年龄段分组进行累加的
2.2.count求解不同客户端总用户数及用户明细列表
select id,client,gender,age,pv,count(id) over(partition by client) as count_total from temp.user_info where id <= 10
order by id
数据结果
| id | client | gender | age | pv | count_total |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 9 |
| 2 | ios | 1 | 26 | 263 | 9 |
| 3 | android | 1 | 35 | 232 | 1 |
| 4 | ios | 1 | 32 | 57 | 9 |
| 5 | ios | 1 | 33 | 67 | 9 |
| 6 | ios | 1 | 36 | 81 | 9 |
| 7 | ios | 1 | 29 | 68 | 9 |
| 8 | ios | 1 | 28 | 19 | 9 |
| 9 | ios | 0 | 32 | 479 | 9 |
| 10 | ios | 1 | 26 | 255 | 9 |
可以看到最后count_total 是按client分组进行计数的
2.3.max求解不同年龄段最大访问量及用户明细列表
select id,client,gender,age,pv,max(pv) over(partition by age) as count_total from temp.user_info where id <= 10
order by age
数据结果
| id | client | gender | age | pv | count_total |
|---|---|---|---|---|---|
| 10 | ios | 1 | 26 | 255 | 263 |
| 2 | ios | 1 | 26 | 263 | 263 |
| 8 | ios | 1 | 28 | 19 | 19 |
| 7 | ios | 1 | 29 | 68 | 174 |
| 1 | ios | 0 | 29 | 174 | 174 |
| 4 | ios | 1 | 32 | 57 | 479 |
| 9 | ios | 0 | 32 | 479 | 479 |
| 5 | ios | 1 | 33 | 67 | 67 |
| 3 | android | 1 | 35 | 232 | 232 |
| 6 | ios | 1 | 36 | 81 | 81 |
可以看到进行了分组求最大值。
min以及avg同理,不再举例。
3.指定列进行分组和排序的聚合计算
3.1.sum按性别分组截止当前年龄总访问量及用户明细列表
select id,client,gender,age,pv,sum(pv) over(partition by gender order by age) as total_pv from temp.user_info where id <= 10
order by gender
数据结果
| id | client | gender | age | pv | total_pv |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 174 |
| 9 | ios | 0 | 32 | 479 | 653 |
| 2 | ios | 1 | 26 | 263 | 518 |
| 10 | ios | 1 | 26 | 255 | 518 |
| 8 | ios | 1 | 28 | 19 | 537 |
| 7 | ios | 1 | 29 | 68 | 605 |
| 4 | ios | 1 | 32 | 57 | 662 |
| 5 | ios | 1 | 33 | 67 | 729 |
| 3 | android | 1 | 35 | 232 | 961 |
| 6 | ios | 1 | 36 | 81 | 1042 |
数据解释:可以看到上述数据,性别为女的29岁及之前年龄段访问pv为174次,女性32岁及之前年龄访问总和pv为653次。
同理男性,不同年龄段及之前年龄的累加数据如上表,且相同年龄的累加值是一致的。
3.2.按性别分组截止当前年龄最大用户访问量及用户明细列表
select id,client,gender,age,pv,max(pv) over(partition by gender order by age) as max_pv from temp.user_info where id <= 10
order by gender
数据明细
| id | client | gender | age | pv | max_pv |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 174 |
| 9 | ios | 0 | 32 | 479 | 479 |
| 2 | ios | 1 | 26 | 263 | 263 |
| 10 | ios | 1 | 26 | 255 | 263 |
| 8 | ios | 1 | 28 | 19 | 263 |
| 7 | ios | 1 | 29 | 68 | 263 |
| 4 | ios | 1 | 32 | 57 | 263 |
| 5 | ios | 1 | 33 | 67 | 263 |
| 3 | android | 1 | 35 | 232 | 263 |
| 6 | ios | 1 | 36 | 81 | 263 |
可以看到男性最大访问量为263
min以及avg同理,不再举例。
3.3.按性别分组截止当前年龄用户总数
select id,client,gender,age,pv,count(id) over(partition by gender order by age) as count_uv from temp.user_info where id <= 10
order by gender,age
数据结果
| id | client | gender | age | pv | count_uv |
|---|---|---|---|---|---|
| 1 | ios | 0 | 29 | 174 | 1 |
| 9 | ios | 0 | 32 | 479 | 2 |
| 2 | ios | 1 | 26 | 263 | 2 |
| 10 | ios | 1 | 26 | 255 | 2 |
| 8 | ios | 1 | 28 | 19 | 3 |
| 7 | ios | 1 | 29 | 68 | 4 |
| 4 | ios | 1 | 32 | 57 | 5 |
| 5 | ios | 1 | 33 | 67 | 6 |
| 3 | android | 1 | 35 | 232 | 7 |
| 6 | ios | 1 | 36 | 81 | 8 |
分组累加求和
综合以上内容,第一部分和第二部分可以通过聚合函数+join的形式实现,但第三部分排序累加计数,实现起来比较困难,而这部分在一些需要分组累加汇总的场景使用很方便。
下一期:hive窗口分析函数使用攻略之二-分组排序窗口函数
按例,欢迎点击此处关注我的个人公众号,交流更多知识。
hive窗口分析函数使用详解系列一的更多相关文章
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- 源码详解系列(六) ------ 全面讲解druid的使用和源码
简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...
- 源码详解系列(八) ------ 全面讲解HikariCP的使用和源码
简介 HikariCP 是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,和 dr ...
- Android 之窗口小部件详解--App Widget
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
- JDBC详解系列(二)之加载驱动
---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- 在JDBC详解系列(一)之流程中 ...
- JDBC详解系列(三)之建立连接(DriverManager.getConnection)
在JDBC详解系列(一)之流程中,我将数据库的连接分解成了六个步骤. JDBC流程: 第一步:加载Driver类,注册数据库驱动: 第二步:通过DriverManager,使用url,用户名和密码 ...
- Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送
Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...
- Android高效率编码-第三方SDK详解系列(二)——Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能
Android高效率编码-第三方SDK详解系列(二)--Bmob后端云开发,实现登录注册,更改资料,修改密码,邮箱验证,上传,下载,推送消息,缩略图加载等功能 我的本意是第二篇写Mob的shareSD ...
- Android高效率编码-第三方SDK详解系列(一)——百度地图,绘制,覆盖物,导航,定位,细腻分解!
Android高效率编码-第三方SDK详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
随机推荐
- Swift高级进阶-Swift编译过程,”SIL代码“,“IR语法”
swift编译过程 如果不懂LLVM,Clang的同学可以去了解下它的知识点 一些文章中有详细介绍 OC 的编译过程 ,本文来探索一下 Swift 的编译过程.Swift 的编译过程中使用 Swif ...
- 【Azure API 管理】APIM服务资源删除后,为什么不能马上创建相同名称的APIM服务呢?
问题描述 使用Azure APIM服务,在删除旧资源准备新建相同名称的新APIM服务时,尝试多次都是出现"指定的服务名称已正在使用"错误.但实际上同名称的服务已经被删除.为什么多次 ...
- 【Azure Redis 缓存】Redis的监控方式? 是否有API接口调用来获取监控值
问题描述 对于PaaS的Azure Cache for Redis,Azure中有哪些监控方式?是否能有api接口调用来获取监控值? 问题答案 1) 在Redis的门户中,使用Metrics查看Red ...
- [Linux] 无显示器 无键盘 网线直连传输文件
有显示器可以操作 这种情况下要简单的多,基本思想是,网线直连之后让其中一方当作网关,分配好ip地址,比如说192.168.8.1,网关也是192.168.8.1即可,如果要填写子网掩码就写255.25 ...
- Docker的使用记录
开始 这是第一个尝试在Leanote上面编写文章,我觉得最重要的事情就是能够保证md文件是能够移植的,否则如果这个软件不靠谱的话,我还能把文章移动到别的地方去.所以先写一篇文章看看效果如何,方便不方便 ...
- RocketMQ(9) 消息堆积与消费延迟
消息堆积与消费延迟 1 概念 消息处理流程中,如果Consumer的消费速度跟不上Producer的发送速度,MQ中未处理的消息会越来越多(进的多出的少),这部分消息就被称为堆积消息.消息出现堆积进而 ...
- 我和我的DBA之路
这几天,突然想写写这些年的工作总结,毕业至今快20年的回顾. 想到20年前,在做毕业设计的时候,当时是学的机械工程类专业,因为带毕业设计的老师兼职企业有个门户网站的需求,而我又会做点网站设计,带的老师 ...
- weekToDo - 一个本地todo软件 - 软件推荐 先用着试试
https://weektodo.me/ https://github.com/Zuntek/WeekToDoWeb/releases/download/v1.7.0/WeekToDo-Setup-1 ...
- 候捷-C++程序设计(Ⅱ)兼谈对象模型
目录 笔记参考 学习目标 转换函数与explicit pointer-like classes function-like classes 模板template 模板特化与偏特化 模板模板参数 引用( ...
- stm32 串口DMA调试总结和反思
一 引言 最近在调试stm32的多串口.没想到居然遇到那么多的问题.这里做一个总结,还是非常有必要的. 二 问题 这里先弄清楚几个问题. 1 串口有必要使用DMA吗? DMA可以在串口高速的时候不占用 ...