前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hive补充之窗口函数

Hive补充之窗口函数

作者头像
Maynor
发布于 2021-04-09 07:05:52
发布于 2021-04-09 07:05:52
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

窗口函数 1、hive窗口函数语法 hive中的窗口函数over() ,over()窗口函数的语法结构

分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)

over()函数中包括三个函数:包括分区partition by 列名、排序order by 列名、指定窗口范围rows between 开始位置 and 结束位置。我们在使用over()窗口函数时,over()函数中的这三个函数可组合使用也可以不使用。

over()函数中如果不使用这三个函数,窗口大小是针对查询产生的所有数据,如果指定了分区,窗口大小是针对每个分区的数据。

over()函数中的三个函数讲解 order by order by是排序的意思,是该窗口中的. partition by partition by可理解为group by 分组。over(partition by 列名)搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。 rows between 开始位置 and 结束位置 是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。 窗口范围说明: 我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

PRECEDING:往前 FOLLOWING:往后 CURRENT ROW:当前行 UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用) UNBOUNDED PRECEDING 表示该窗口最前面的行(起点) UNBOUNDED FOLLOWING:表示该窗口最后面的行(终点) 比如说: ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行) ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行) ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到当前行) ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示当前行到终点) 2、常与over()一起使用的分析函数: 2.1、聚合类 avg()、sum()、max()、min() 2.2、排名类 row_number()按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6) rank() 按照值排序时产生一个自增编号,值相等时会重复,会产生空位(如:1、2、3、3、3、6) dense_rank() 按照值排序时产生一个自增编号,值相等时会重复,不会产生空位(如:1、2、3、3、3、4) 2.3、其他类 lag(列名,往前的行数,[行数为null时的默认值,不指定为null]),可以计算用户上次购买时间,或者用户下次购买时间。 lead(列名,往后的行数,[行数为null时的默认值,不指定为null]) ntile(n) 把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号 案例一: 1、使用 over() 函数进行数据统计, 统计每个用户信息及表中数据的总条数 2、求用户明细并统计每天的用户总数 3、计算从第一天到现在的所有 score 大于80分的用户总数 日期 用户ID 分数 logday uid score

字段说明: 数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
20201210,10001,84
20201210,10002,83
20201210,10003,86
20201211,10001,87
20201211,10002,65
20201211,10003,98
20201212,10001,67
20201212,10002,28
20201212,10003,89
20201213,10001,99
20201213,10002,55
20201213,10003,57

建表并导入数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table test_window
(day string,    
uid string, 
score int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

#加载数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
load data local inpath '/export/data/hive/test_window.txt' into table test_window;

1、使用 over() 函数进行数据统计, 统计每个用户信息及表中数据的总条数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *, count(uid) over() as total  from  test_window;

2、求用户明细并统计每天的用户总数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select  *,count(*) over(partition by logday)as day_total from  test_window;

3、计算从第一天到现在的所有 score 大于80分的用户总数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select  *,count(*) over(order by logday rows between unbounded preceding and current row)as total from  test_window where score > 80;

案例二: 1、查询在2020年4月份购买过的顾客及总人数 2、查询顾客的购买明细及月购买总额 3、查询顾客的购买明细及到目前为止每个顾客购买总金额 4、查询顾客上次的购买时间 5、查询前20%时间的订单信息

字段说明: 用户名 订单日期 订单金额 name orderdate cost

数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jack,2020-01-01,11
tony,2020-01-02,16
jack,2020-02-03,22
tony,2020-01-04,28
jack,2020-01-05,47
jack,2020-04-06,43
tony,2020-01-07,50
jack,2020-01-08,55
mart,2020-04-08,63
mart,2020-04-09,69
tom,2020-05-10,13
mart,2020-04-11,76
tom,2020-06-12,81
mart,2020-04-13,95

建表并导入数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table business
(
name string, 
orderdate string,
cost int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

#加载数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
load  data local inpath "/export/data/hive/business.txt" into table business;

1、查询在2020年4月份购买过的顾客及总人数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select   *,count(*) over() as total  from  business  where substr(orderdate,1,7) = '2020-04';

2、查询顾客的购买明细及月购买总额

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *,sum(cost) over(partition by name,substr(orderdate,1,7)) total_amount
from business;

3、查询顾客的购买明细及到目前为止每个顾客购买总金额

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *,sum(cost) over(partition by name order  by  orderdate 
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total_amount
from business;

4、查询顾客上次的购买时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select name,orderdate,cost,lag(orderdate,1) over(partition by name order by orderdate) last_date
from business;

5、查询前20%时间的订单信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select  * 
from 
(select *,
ntile(5)over(order  by  orderdate)  group_num from  business) t 
where t. group_num = 1;

案例三: 1、每门学科学生成绩排名(是否并列排名、空位排名三种实现) 2、每门学科成绩排名top 3的学生

字段说明: 姓名 科目 成绩 name subject score

数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
建胜	语文	87
建胜	数学	95
建胜	英语	68
班长	语文	94
班长	数学	56
班长	英语	84
副班长	语文	64
副班长	数学	86
副班长	英语	84
团支书	语文	65
团支书	数学	85
团支书	英语	78

建表导入数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table score
(
name string,
subject string, 
score int
) row format delimited fields terminated by "\t";

#加载数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
load data local inpath '/export/data/hive/window_score.txt' into table window_score;

1、每门学科学生成绩排名(是否并列排名、空位排名三种实现)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select  *,
row_number()over(partition by subject order by score desc) as rn,
rank()over(partition by subject order by score desc) as rk,
dense_rank()over(partition by subject order by score desc) as dr
from window_score;

2、每门学科成绩排名top 3的学生

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
*
from 
(
select 
*,
row_number() over(partition by subject order by score desc) rmp
from window_score
) t
where t.rmp<=3;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
业余草
2020/02/13
1.8K0
Java 泛型深入解析:类型安全与灵活性的平衡
Java 泛型(Generics)是一个强大的语言特性,它允许在类、接口和方法中使用参数化类型,从而实现代码的重用、增强类型安全性,并提升代码的可读性。泛型的引入解决了 Java 编程中常见的类型转换问题,使得我们能够编写更加灵活且健壮的代码。然而,泛型背后的类型擦除(Type Erasure)机制和一些高级特性也给我们带来了一定的挑战。
科技新语
2024/10/11
1800
Java 泛型深入解析:类型安全与灵活性的平衡
Java知识点总结之Java泛型
作者:苏生 链接: https://segmentfault.com/a/1190000014824002 泛型 泛型就是参数化类型 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定 泛型归根到底就是“模版” 优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换。 泛型主要使用在集合中 import java.util.ArrayList; import java.util.List; public class Demo01 { // 不使用泛型,存取数据麻烦
用户1257393
2018/07/30
5730
编程思想 之「泛型」
对于一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义类型。如果我们要想编写可以应用于多种类型的代码,这种限制就会对代码产生非常大的束缚。在面向对象的语言中,多态算是一种泛化的机制,因为我们可以将方法的参数类型设为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数。为了实现将代码复用于多种类型,Java SE5 引入了一个非常重要的概念“泛型”,其含义为:泛化的代码,适用于多种具体的类型。遗憾的是,虽然 Java 泛型的出现使得 Java 向前迈进了一大步,但是由于 Java 语言是在发行近 10 年后才引入泛型的,为了兼容老代码,Java 的泛型并不纯粹。
CG国斌
2019/05/26
4770
深入理解 Java 泛型
泛型要求在声明时指定实际数据类型,Java 编译器在编译时会对泛型代码做强类型检查,并在代码违反类型安全时发出告警。早发现,早治理,把隐患扼杀于摇篮,在编译时发现并修复错误所付出的代价远比在运行时小。
静默虚空
2022/03/23
4390
深入理解 Java 泛型
夯实Java基础系列13:深入理解Java中的泛型
本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
Java技术江湖
2019/10/07
4200
Java中的泛型(很细)
非常好,让我们深入探讨Java中的泛型这个重要主题。我将按照之前提供的框架,为您创作一篇全面而专业的技术博客文章。
程序员朱永胜
2024/07/18
2280
Java中的泛型(很细)
【Java】泛型
🍊 泛型(Generics)是Java编程语言中的一个强大的特性,它提供了 编译时类型安全检测机制,这意味着可以在编译期间检测到非法的类型。泛型的使用减少了程序中的强制类型转换和运行时错误的可能性。
IsLand1314
2024/10/21
1510
【Java】泛型
泛型的特点
在 Java SE 1.5 之后,泛型(Generics)作为一项重要的语言特性被引入。泛型让开发者可以编写更通用、类型安全的代码,并允许在编译时进行类型检查,从而减少运行时错误。正如《Java 核心技术》中的定义:“泛型意味着编写的代码可以被不同类型的对象所重用。”
繁依Fanyi
2024/10/26
1460
Java泛型详解,史上最全图文详解「建议收藏」
毫不夸张的说,泛型是通用设计上必不可少的元素,所以真正理解与正确使用泛型,是一门必修课。
全栈程序员站长
2022/09/08
9630
Java泛型深入理解「建议收藏」
在面向对象编程语言中,多态算是一种泛化机制。例如,你可以将方法的参数类型设置为基类,那么该方法就可以接受从这个基类中导出的任何类作为参数,这样的方法将会更具有通用性。此外,如果将方法参数声明为接口,将会更加灵活。
全栈程序员站长
2022/09/10
8830
【Java基础】JavaCore核心-泛型技术
互联网小阿祥
2023/05/28
3870
【Java基础】JavaCore核心-泛型技术
深入理解Java包装类与泛型的应用
在Java中,装箱(boxing)是指将基本数据类型(如int, char, double等)转换为对应的包装类对象(如Integer, Character, Double等)的过程。相反,拆箱(unboxing)是指将包装类对象转换回基本数据类型的过程。
学无止尽5
2024/11/29
1790
深入理解Java包装类与泛型的应用
那些年我们在Java泛型上躺过的枪---万恶的泛型擦除【享学Java】
泛型(Generics),从字面的意思理解就是泛化的类型,即参数化类型。 我们都知道,泛型是JDK5提供的一个非常重要的新特性,它有非常多优秀的品质:能够把很多问题从运行期提前到编译器,从而使得程序更加的健壮。
YourBatman
2019/09/03
1K0
那些年我们在Java泛型上躺过的枪---万恶的泛型擦除【享学Java】
【面试题精讲】泛型&通配符
泛型(Generics)是 Java 中的一种特性,它允许我们在定义类、接口和方法时使用类型参数。通过使用泛型,我们可以编写更加通用和可复用的代码。
程序员朱永胜
2023/10/14
3930
Java 泛型:概念、语法和应用
上述代码中,类 MyGenericClass 定义了一个泛型类型参数 T,它可以用来表示任何数据类型。
小尘要自信
2023/10/10
2510
细说 Java 泛型及其应用
当获取列表中的第二个元素时,会报错,java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String。这是常见的类型转换错误。
aoho求索
2019/05/07
7260
年后跑路第一战,从Java泛型学起!
大家好,我是麦洛,今天来复习一下泛型。JDK 5.0 引入了 Java 泛型,允许设计者详细地描述变量和方法的类型要如何变化,使得代码具有更好的可读性。本文章是对 Java 中泛型的快速介绍,包含泛型背后的目标以及使用泛型如何提高我们代码的质量。
麦洛
2022/03/14
7360
年后跑路第一战,从Java泛型学起!
Java的“泛型”特性,你以为自己会了?(万字长文)
使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合、反射、泛型、注解等等,这些可以说我们在平时开发中是经常使用到的,尤其是集合,基本是只要写代码没有用不到的,今天我们先来谈谈泛型。
小灰
2022/09/01
4390
Java的“泛型”特性,你以为自己会了?(万字长文)
Java泛型详解:为什么使用泛型?如何使用泛型?
大家好!今天我要和大家一起探讨的是Java泛型,一个让我们的代码更加灵活、可读性更强的强大特性。相信很多人都听说过泛型,但对于为什么使用泛型、如何使用泛型以及泛型的实现原理和本质,可能还有些困惑。别担心,我会通过通俗易懂的语言,带你深入了解这一话题,并为你提供一些实例演示。
默 语
2024/11/20
3560
相关推荐
带你深挖Java泛型类型擦除以及类型擦除带来的问题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档