Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hive常用窗口函数实战

Hive常用窗口函数实战

作者头像
Eights
发布于 2020-07-13 06:28:40
发布于 2020-07-13 06:28:40
2.8K00
代码可运行
举报
文章被收录于专栏:Eights做数据Eights做数据
运行总次数:0
代码可运行

本篇文章大概3799字,阅读时间大约10分钟

本文介绍了Hive常见的序列函数,排名函数和窗口函数。结合业务场景展示了Hive分析函数的使用

Hive作为一个分析型的数据仓库组件提供了很多分析函数,熟练使用分析函数可以快速的进行离线业务的开发。

窗口函数属于分析函数,主要用于实现复杂的统计需求。窗口函数和聚合函数的主要区别是:在分组后,窗口函数会返回组内的多行结果而聚合函数一般返回一行结果。

1

over关键字

窗口函数是针对每行数据的窗口,使用over关键字可以进行窗口创建,如果over中没有给定参数,会统计全部结果集。

举个栗子

数据集:销售表

dep_no

部门

series_code

商品类型

code_sales_num

销售数量

业务场景

统计每个部门内每种商品占总销售数量的百分比

如果不使用over关键字,那么第一步应该先计算总数,然后把总数带入hql进行计算,HQL如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--计算总数 总数为22089,再带入hql中进行计算
select sum(code_sales_num) from lab.dep_sales_detail

--计算商品销售占比
select dep_no, series_code, code_sales_num, 22089 as total_sales_num,
concat(round((code_sales_num / 22089) * 100, 2), '%') as sales_ratio
from lab.dep_sales_detail

这种写法会产生两个job,需要把第一步的结果带入第二步进行计算,比较麻烦

使用over关键字进行开窗操作

over关键字可以清晰的表达统计商品占比的业务逻辑,且只产生了一个job

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select dep_no,
series_code,
code_sales_num,
sum(code_sales_num) over() dep_sales_num ,
concat(round((code_sales_num / sum(code_sales_num) over() * 100), 2), '%') as sales_ratio
from lab.dep_sales_detail

执行结果如下

2

partition by

partition by表示在over执行的窗口中进行分区操作,也就是在进行分区统计

业务场景

统计每个部门内每种商品占该部门总销售数量的百分比

HQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select dep_no,
series_code,
code_sales_num,
sum(code_sales_num) over(partition by dep_no) dep_sales_num ,
concat(round((code_sales_num / sum(code_sales_num) over(partition by dep_no) * 100), 2), '%') as sales_ratio
from lab.dep_sales_detail

执行结果

这里可以看到partition by子句将dep_no分为了两组,分别统计其总和

3

partition by order by

over(partition by order by)子句,统计的是从分区的第一行到当前行的统计值,可以认为是window函数的特例

业务场景

统计每天每个部门每种商品的累计销售情况 数据集:每日销售表

dep_no

部门编号

series_code

商品类别

sales_date

销售日期

sales_num

销售数量

该业务表达的是按照日期统计累计的销售情况,也就是以每个商品进行分区,从初始行一直累加到当前行的统计值

HQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select series_code,
sales_date,
sales_num,
sum(sales_num) over (partition by series_code order by sales_date) as cum_sales
from lab.code_sales_detail

从结果来看,该HQL实现了日期升序下的销售数量累加统计

4

window窗口

partition by order by语法给出了一个从分区首行到当前行的窗口,如果业务需要对窗口进行细粒度划分,则需要使用窗口函数

窗口函数中可以指定窗口大小,下表展示了一个商品从5月1日开始到6月1日的销售情况

  • unbounded preceding指分区的上限——分区的第一行
  • 1 preceding指当前行的上一行
  • 1 following指当前行的下一行
  • unbounded following指分区的下限——分区的最后一行

业务场景

统计每种商品近7天的销售数量

思路:采用一个6 preceding到current row的窗口进行业务统计

HQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select series_code,
sales_date,
sales_num,
sum(sales_num) over (partition by series_code order by sales_date rows between 6 preceding and current row) as cum_sales
from lab.code_sales_detail

上述的HQL实现了一种滑动窗口的效果,也就是从分区的顶部开了一个7个元素的窗口在以步长=1的方式往下滑动求和

Tip:以下两个窗口的语义相同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 窗口1
over (partition by series_code order by sales_date
rows between unbounded preceding and current row)
-- 窗口2
over (partition by series_code order by sales_date)

5

排名函数-TopN求解

对数据集分组求排名的需求非常常见(Top-N)

  • 求取各产品线的销量前三
  • 求取产品各功能模块使用次数前三

Hive可以非常便捷的利用排名函数实现类Top-N的需求。常用的排名函数有以下三个:

函数名

特点

例子

row_number

顺序增加排名

1 2 3 4 5......

rank

相同排名并列且留下顺序空位

1 2 2 4 5......

dense_rank

相同排名并列且顺序增加

1 2 2 3 4......

测试数据:班级 - 学生 - 成绩

按照班级用三种排名函数进行排名,HQL如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select cname, sname, score,
row_number() over (partition by cname order by score desc) as row_number_res,
rank() over (partition by cname order by score desc) as rank_res,
dense_rank() over (partition by cname order by score desc) as dense_rank_res from t2;

查询结果如下

可以看出row_number会一直按照排序顺序走,rank如果存在并列的情况,会进行计数,也就是说rank函数认为并列的记录会进行排名占位。相反,dense_rank认为并列的记录不会占用排名的顺序。

以上三个函数需要根据业务场景灵活使用。

业务场景

统计每个班的前三名,并列名次算作一个名次。

并列算作一个名次则使用dense_rank函数,先排名然后对名次进行过滤即可 HQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with q1 as (
select cname, sname, score,
dense_rank() over (partition by cname order by score desc) as rank 
from t2
)
select * from q1
where rank <= 3

查询结果如下:

6

序列函数-物联网状态变化统计分析

Hive中常见的序列函数

lag

当前行上一行数据

lead

当前行下一条数据

first_value

分区窗口内的第一个值

last_value

分区窗口内的最后一个值

ntile

将分组数据按顺序切分

有了之前的分析函数经验,这里不展示每个序列函数的用途,下面以物联网的一个典型场景介绍lead函数的使用。

业务场景

统计物联网控制板上温度控制模块的使用次数(曾经为了实现这个需求,我写了Spark应用去分组按照时间排序,然后遍历数据集。。。

),其中温控模块的关闭状态为0,打开状态为1。统计使用次数,即是统计温控模块的状态从0-1的变化次数。

数据格式:设备ID - 时间戳 - 温控模块状态

统计思路:统计0-1的状态跳变,在当前行获取上一行的status值作为一列并在最后即可,然后通过lag_status = 0 and status = 1即可统计出使用的次数

HQL:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select device_id, device_time, status,
lag(status) over(partition by device_id order by device_time) as lag_status 
from temp_status;

完整的统计HQL如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with q1 as (
select device_id, device_time, status,
lag(status) over(partition by device_id order by device_time) as lag_status
from temp_status
)
select device_id, count(1) as use_num
from q1
where lag_status = 0 and status = 1
group by device_id

执行结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Eights做数据 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
史上最全分布式数据库概述
墨墨导读:在集中式数据库系统不能完全符合实际需要的形势下,集中式DB的“集中计算”概念向“分布计算”概念发展。分布计算主要体现在客户机/服务器模式的分布式数据库体系结构两个方面。
数据和云
2019/06/18
6.9K0
史上最全分布式数据库概述
软考系统架构设计师(二):数据库设计
数据库视图:它一个虚拟表(逻辑上的表),其内容由查询定义(仅保存SQL查询语句)。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并没有真正存储这些数据,而是通过查询原始表动态生成所需要的数据。
陈大剩博客
2023/03/06
9230
软考系统架构设计师(二):数据库设计
分布式数据库有什么用?分布式数据库的总体特征有哪些?
大数据时代对数据处理能力的要求比较高,因而衍生出了很多种数据处理软件,比如能够储存大量数据的数据库数据库分为很多种类型,传统数据库主要是集中式数据库,目前出现了新型的分布式数据库,下面为大家简单介绍分布式数据库有什么用?以及分布式数据库的总体特征有哪些?
用户8715145
2021/10/18
2.4K0
小白入门,如何选择数据分片字段
分布式数据库,是近些年来非常颇受关注的领域。一方面随着数据规模不断增大,数据使用场景更为多样,对底层数据库的要求越来越高;另一方面对数据库的可用性、扩展能力等也都提出更高的要求。分布式数据库的出现,恰好满足了上述两方面的诉求。但当用户选择使用分布式的第一个问题,就是如何将之前基于单机或集中式数据库设计的数据结构迁移到分布式环境中,核心点就在于数据分片的设计。这其中的核心要点有两个:一是选择什么字段或字段组合作为分片键;二是使用什么分片算法来分片。本文尝试说明第一个问题。
用户5548425
2022/11/24
8760
小白入门,如何选择数据分片字段
数据库技术的发展
(1)第一代数据库系统是指层次模型数据库系统(基于树形结构)和网状模型数据库系统(基于有向图结构)
ellipse
2019/08/16
9470
系统分析师真题2019试卷相关概念二
企业应用实体及其联系,属于数据库设计的概念设计阶段,应用中的实体及其关系,也就是在做ER图建模,这是概念结构设计阶段的任务。
小马哥学JAVA
2023/02/21
3200
[每天五分钟,备战架构师-10]数据库系统
事务是数据库系统运行的基本工作单位,相当于操作系统中的进程,事务具有ACID特性。从用户的角度来看,事务中的操作要么都做,要么都不做。
大江小浪
2018/09/19
1.6K0
分布式数据库选型—数据水平拆分方案
水平拆分的概念随着分布式数据库的推广已为大部分人熟知,分库分表、异构索引、小表广播、这些功能几乎是产品功能需求标配。然而有些客户使用分布式数据库后的体验不尽如意。本文尝试从数据的角度总结分布式数据的复制(replication)和分区(partition)技术原理和方案,其中分区也有称为分片(sharding),希望能引起读者一些思考,在分布式数据库选型中能注意这些细节的区别,选择适合业务的数据水平拆分方案。
用户1278550
2019/06/20
1.3K0
分布式数据库选型—数据水平拆分方案
国产分布式数据库架构初印象
与Oracle在华大规模裁员相比,国产数据库好消息连连,2019年可以说是国产数据库年。举几个例子,华为推出GaussDB,并成功上线招商银行/工商银行核心系统;中信信用卡系统运行在中兴GoldenDB之上;Oceanbase登顶TPC-C....
王录华
2020/01/15
3.7K0
系统分析师考试高频考试知识点
分布式数据库是由一组数据组成的,这组数据分布在计算机网络的不同计算机上,网络中的每个节点具有独立处理的能力(称为场地自治),它可以执行局部应用,同时,每个节点也能通过网络通信子系统执行全局应用。分布式数据库系统是在集中式数据库技术的基础上发展起来的,具体有如下特点:
小马哥学JAVA
2023/07/15
2280
系统分析师考试高频考试知识点
分布式数据库是不同的
今天的话题有两层含义,第一层是说相对于我们所熟知的集中式数据库来说,分布式数据库是与之不同的。在做数据库选型的时候,我们要充分的了解其间的不同,才能做出较为科学的决策。我想很多数据库从业人员都了解其中的不同,不幸的是,他们不是数据库选型的决策者,大多数决策者并不了解这一点。
jeanron100
2023/09/04
3340
分布式数据库是不同的
十问分布式数据库:技术趋势、选型及标准思考
嘉宾 |李卫、王南、杨建荣、刘博 编辑 |赵钰莹 随着信息技术的迅猛发展,各行各业产生的数据量呈爆炸式增长,传统集中式数据库的局限性在面对大规模数据处理中逐渐显露,从而分布式数据库应运而生。分布式数据库是在集中式数据库的基础上发展起来的,是分布式系统与传统数据库技术结合的产物,具有透明性、数据冗余性、易于扩展性等特点,还具 备高可靠、高可用、低成本 等方面的优势,能够突破传统数据库的瓶颈。 分布式数据库目前已应用到金融、电信等大数据行业,未来将走向更广阔的领域。本期“数据库 Talk Show”圆桌直
深度学习与Python
2023/03/29
5770
十问分布式数据库:技术趋势、选型及标准思考
分布式数据库系统是什么?分布式数据库系统具有哪些优点?
网络信息的发展也使得数据的数量越来越庞大,想要除草如此庞大的数据,需要借助数据库的帮忙,目前数据库的种类非常多样,其中分布式数据库是一种较为新兴的数据库类型,下面为大家简单介绍分布式数据库系统是什么?以及分布式数据库系统主要有哪些优点?
用户8715145
2021/10/18
1.7K0
小工具:助你上手分布式数据库
分布式数据库,无疑是近些年来数据库领域的重大技术进步。越来越多的用户考虑将传统集中式或单机数据库,迁移到分布式数据库。然而,正如同其他新技术一样,使用分布式数据库同样面临一定的使用门槛。如何平滑地迁移到这一新架构,享受新架构带来的优势的同时,还需规避潜在的劣势。尽管很多分布式数据库产品,正努力降低使用门槛,让用户近似传统数据库的体验去使用它,但这一过程仍面临诸多问题。此外,要想更好地使用分布式数据库,是需要其实现细节有着更多的了解。本文,尝试从研发角度谈谈,如何上手分布式数据库,针对常见的如何做表分片、如何选择分片键等问题加以描述。为了降低过程难度,结合之前在项目实施中的一点经验,自己也尝试编写工具来方便迁移分析。
用户5548425
2022/11/24
3870
小工具:助你上手分布式数据库
分布式数据库 到底分布在哪里了,优缺点在哪里
公司技术分为浓重,在众多的兴趣小组里面有一个分布式数据库的小组,本周五需要进分享,是在是惭愧,作为这个小组的 specialist, 啥都没有做,所以赶紧弄弄,要不说啥。
AustinDatabases
2022/12/12
2.1K0
分布式数据库  到底分布在哪里了,优缺点在哪里
Postgres 分布式数据库
聊起分布式数据库,大家第一印象估计是 谷歌的 Spanner ,以及 TiDB。其实还有另外一种分布式 Postgres-XC (目前已经迭代到 PostgreSQL-X2 ),Postgres-XC 数据库系统主要是基于水平可伸缩的share nothing 架构,支持全局事务,表分区,复制以及查询计划在各个节点并行执行。
用户1278550
2022/05/17
2.2K0
Postgres 分布式数据库
关于分布式缓存的理解
分布式缓存首先通过上节课的学习,现在我们已经知道了,服务端缓存可以分为“进程内缓存”和“分布式缓存”两大类。相比缓存数据在进程内存中读写的速度,一旦涉及到了网络访问,那么由网络传输、数据复制、序列化和反序列化等操作所导致的延迟,就要比内存访问高得多。
燃192
2023/04/10
5680
关于分布式缓存的理解
Oracle数据库应用系统结构
在安装、部署Oracle数据库软件时,需要根据不同应用结构(即硬件平台、操作系统平台)采用不同的方法(基本安装、高级安装),下面介绍几种常见的应用结构。
数据和云
2019/08/01
1.1K0
Oracle数据库应用系统结构
从TDSQL,看分布式数据库的技术之美
导语 | 每一个时间段总是一个新时代,新技术层出不穷使得数据库技术焕发新生。Spanner、CockroachDB、TDSQL等分布式数据库正是这个时代的弄潮儿。本文由腾讯云数据库专家工程师 李海翔在 Techo TVP开发者峰会「数据的冰与火之歌——从在线数据库技术,到海量数据分析技术」 的《分布式数据库的演进》演讲分享整理而成,带大家品味分布式数据库架构、前沿技术和TDSQL技术实践,感受分布式数据库的技术之美。 点击可观看精彩演讲视频 一、分布式数据库架构 我今天所分享的内容主要集中在数据库技
腾讯云开发者
2021/05/13
2.1K0
深度解析:腾讯云分布式数据库 DCDB
文章介绍了分布式数据库在项目中的使用场景,以及基于腾讯云DCDB的具体实现方案,包括分表、分库、负载均衡、高可用等方面的内容。
腾讯云数据库团队
2017/06/27
7.1K1
深度解析:腾讯云分布式数据库 DCDB
推荐阅读
相关推荐
史上最全分布式数据库概述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验