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详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
随机推荐
- 【LeetCode二叉树#13】遍历二叉搜索树
二叉搜索树中的搜索 力扣题目地址(opens new window) 给定二叉搜索树(BST)的根节点和一个值. 你需要在BST中找到节点值等于给定值的节点. 返回以该节点为根的子树. 如果节点不存在 ...
- 【Azure Cache for Redis】Redis的导出页面无法配置Storage SAS时通过az cli来完成
问题描述 在Azure Redis的导出页面,突然不能配置Storage Account的SAS作为授权方式. 那么是否可以通过AZ CLI或者是Powershell来实现SAS的配置呢? 问题解答 ...
- 【Azure 存储服务】关于对Azure Storage Account 的 Folder 权限管理和设定
问题描述 在一个storage account下面有很多folder,需要对不同的folder设置不同的权限给到不同的用户来访问使用,怎么样设定比较合理? 问题解答 一:可以使用SAS共享访问签名进行 ...
- Netty笔记(3) - 核心组件
各组件关系示意图: Bootstrap 和 ServerBootstrap 说明: Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Ne ...
- 15. JVM垃圾回收器详解
1. 垃圾回收器的分类 和 GC性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现. 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC ...
- C++ //STL---常用算法 //常用遍历 for_each //transform
1 //STL---常用算法 2 //常用遍历 for_each 3 //transform 4 #include<iostream> 5 #include<string> 6 ...
- WireShark学习笔记(一)
1.从WireShark分析网络层协议的传输 下面是网络接口层协议,从图中可以看到两个相邻设备的MAC地址,因此该网络包才能以接力的方式传送到目的地址. 下面是网络层,在这个包中,主要的任务是把TCP ...
- sql99等值&&非等值查询
1 #二.sql99语法 2 /* 3 语法 4 SELECT 查询列表 5 FROM 表1 别名 [连接类型] 6 JOIN 表2 别名 7 on 连接条件 8 [where 筛选条件] 9 [gr ...
- 适用于AbpBoilerplate的阿里云腾讯云Sms短信服务
Sms 适用于AbpBoilerplate的短信服务(Short Message Service,SMS)模块,通过简单配置即可使用,仅更改一处代码即可切换短信服务提供商. Aliyun.Sms由阿里 ...
- git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决
git reset --soft HEAD^^ 项目提交代码冲突 提交当前merge后,别提交远程,用命令回滚2次,到未提交的版本,再拉取同事代码,冲突解决 当多人写一个项目,最好还是关掉vscode ...