首页 > 其他分享 >hive窗口分析函数使用详解系列一

hive窗口分析函数使用详解系列一

时间:2024-04-07 20:58:53浏览次数:21  
标签:窗口 gender age ios hive 详解 pv 479 id

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窗口分析函数使用攻略之二-分组排序窗口函数

按例,欢迎点击此处关注我的个人公众号,交流更多知识。

标签:窗口,gender,age,ios,hive,详解,pv,479,id
From: https://www.cnblogs.com/lubians/p/18119840

相关文章

  • 【Spring进阶系列丨第七篇】Spring框架新注解分类及详解
    文章目录一、Spring新注解1.1、Configuration注解1.1.1、定义一个类1.1.2、使用Configuration注解修饰类1.1.3、作用1.2、Bean注解1.2.1、定义bean1.2.2、在主配置类中注册bean1.2.3、测试容器中是否有该bean1.2.4、注册bean的同时可以指定bean名称1.2.5、补充内容1.2.5......
  • Git 使用详解
    前言:Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。但是很多同学仍然不会用,今天我们就来详细讲一下这个Git到底怎么玩。一、安装Git客户端1.这里为大家提供了windows版的Git客户端以及安装图文详解文档。百度网盘:https://pan.baidu.com/s/1CDu0......
  • Offer必备算法22_优先级队列_堆_四道力扣题详解(由易到难)
    目录①力扣1046.最后一块石头的重量解析代码②力扣703.数据流中的第K大元素解析代码③力扣692.前K个高频单词解析代码④力扣295.数据流的中位数解析代码本篇完。①力扣1046.最后一块石头的重量1046.最后一块石头的重量难度简单有一堆石头,每块石头的重......
  • Redis的前世今生(内存管理、持久化、高可用、集群 详解)一看就懂
    Redis的诞生:    redis的诞生和mysql脱不了关系,在redis还未出现时,用户的每次请求都是直接访问mysql,渐渐的人们发现,请求大部分都是读操作,而且很多都是重复的数据,磁盘的i/o是很慢的,所以人们就想,能不能学学cpu建立的缓存机制,mysql也搞一个缓存,就这样一个基于内存的数据库......
  • opencv基础操作:读取图片时使用灰度方式、转换颜色空间、使用opencv展示图片、使用open
    包含的操作有:读取图片时使用灰度方式转换颜色空间使用opencv展示图片使用opencv对BGR通道进行划分并展示,需要注意的是直接使用cv2.split()得到的B,G,R分别是单通道的,因此最终展示出来为灰度图像。    如果想保留彩色图像,可以直接对img切片来实现。使用opencv在一个窗口......
  • Opencv实现边界填充、两个图片像素直接相加后超过255的处理方式(阈值处理方式),一个窗口
     opencv两个图片直接相加,会直接相加,如果超过255,会取模。 print((img_cat+img_cat2)[:5,:,0])#0-255若相加越界后294用294%256获得余数38可以使用这种方式查看。展示的是前5行,所有列的第一个通道的值。还有一种方法是cv2.add(),这个方法会直接将超过255的值设置为25......
  • GO 语言编写的程序运行过程详解
    1.1go源代码packagemainfuncmain(){goadd(1,2)}funcadd(a,bint)(int,int,int){returna+b,a,b}1234567先来看看上面这段程序的反汇编代码:1.2add函数反汇编代码0x401050  48c744241800000000  MOVQ$0x0,0x18(SP)0x401059  48c744......
  • ERC314协议代币开发及合约开发详解
    ERC314是一种新的代币标准,旨在为BASE链上的代币提供更便捷、高效的交易体验。它由DAPJ项目团队开发,并于2023年8月首次发布。ERC314的特点无需依赖DEX或SWAP进行交易: ERC314代币可以像原生代币一样直接转账,无需借助DEX或SWAP进行交易。这使得交易更加......
  • TS — Symbol详解
    symbol是TypeScript中的基本数据类型之一,用于表示唯一的标识符。每个通过Symbol()构造函数创建的symbol值都是独一无二的,并且不可变。1.创建symbol:可以使用Symbol()构造函数来创建一个新的symbol值:letsym1=Symbol();letsym2=Symbol("key");sym1和sym2......
  • HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)
        前言:在上一篇文章中,我们已经学习完了超链接标签、列表标签和表格标签,但是我们还有一些标签没有学习,在这篇文章中,我们将学习剩余的标签。✨✨✨这里是秋刀鱼不做梦的BLOG✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客首先让我们看一下还剩余......