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详解系列(一)--百度地图,绘制,覆盖物,导航,定位,细腻分解! 这是一个系列,但是我也不确定具体会更新多少期,最近很忙,主要还是效率的问题,所以一些有效的东西还 ...
随机推荐
- Kotlin 基础入门
目录 一.基础语法 1.1 常见数据类型 1.2 变量 1.2.1 变量声明 1.2.2 类型推断 1.2.3 Null 安全 1.2.4 面向对象语言 1.3 流程控制 1.3.1 if 表达式 1 ...
- 【Azure 应用服务】App Service for Linux 环境中为Tomcat页面修改默认的Azure 404页面
问题描述 在App Service Linux环境中,如部署Tomcat 应用后,如果访问的页面找不到,应用会返回一个由Azure生成的404页面,那么是否可以修改它呢? PS: 如果是App Ser ...
- 【Azure Redis 缓存】Redis Geo-replication(异地复制)的问题
问题描述 在Azure官网中,已列出了一系列的常规问题:https://docs.azure.cn/zh-cn/azure-cache-for-redis/cache-how-to-geo-repli ...
- 「实操」结合图数据库、图算法、机器学习、GNN 实现一个推荐系统
本文是一个基于 NebulaGraph 上图算法.图数据库.机器学习.GNN 的推荐系统方法综述,大部分介绍的方法提供了 Playground 供大家学习. 基本概念 推荐系统诞生的初衷是解决互联网时 ...
- 答对这 9 题你就超越了 83.3% 的图数据库 NebulaGraph 用户
熟悉 NebulaGraph 社区的小伙伴可能都知道一个技能认证叫做:NGCP,全称 NebulaGraph Certified Professional.用户在考试认证期间在 1 个小时内回答 10 ...
- JavaScript 最新动态:2024 年新功能
前言 随着 Web 技术的日新月异,JavaScript 也在不断地吸收新的特性和技术,以满足日益复杂和多样化的开发需求.在 2024 年,JavaScript 迎来了一系列令人瞩目的新功能,这些功能 ...
- [学习笔记] Linux 环境下搭建基于Ngnix的反向代理服务
之前为了方便同事测试微信小程序,搭建了基于CentOS的预发布环境,.Net5 程序也已经部署好在上面,在公网上可以通过http协议的临时域名(jevonsflash.xxx.net)访问到后台Ap ...
- ansible-vault 教程
基本使用 在编写playbook时,可能会涉及到一些敏感的数据,比如密码,当这些敏感数据以明文的方式存储在playbook中时,可能是不能被接受的,那么我们该怎么办呢?ansible官方已经考虑到了这 ...
- mockjs 前端写完 给后台调 mock.js | 改到2.0版本
需求:最近活太忙了,实在是联调没有时间了,无奈又拾起来mockjs 1 安装mockjs npm install mockjs // 这是个只在开发的时候用,打包后就没有了,业务更安全 npm ins ...
- ECharts 中国地图 vue
<template> <div> <div id="china_map_box"> <div id="china_map&quo ...