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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
动手学深度学习(三) 多层感知机
深度学习主要关注多层模型。在这里,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
致Great
2020/02/24
1.1K0
从零开始学Pytorch(三)之多层感知机的实现
我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
墨明棋妙27
2022/08/24
1.2K0
从零开始学Pytorch(三)之多层感知机的实现
机器学习(ML)三之多层感知机
多层感知机深度学习主要关注多层模型,现在以多层感知机(multilayerperceptron,MLP)为例,介绍多层神经网络的概念。隐藏层多层感知机在单层神经网络的基础上引入了一到多个隐藏层
Java架构师必看
2022/01/11
8720
机器学习(ML)三之多层感知机
【机器学习-监督学习】神经网络与多层感知机
  本文将会介绍机器学习中最重要的内容之一——神经网络(neural network,NN),它是深度学习的基础。神经网络的名称来源于生物中的神经元。自有计算机以来,人们就希望能让计算机具有和人类一样的智能,因此,许多研究者将目光放到了人类的大脑结构上。作为生物神经系统的基本单元,神经元在形成智能的过程中起到了关键作用。神经元的结构并不复杂,简单来说,神经元由树突、轴突和细胞体构成。图1是神经元的结构示意图。由其他神经元传来的神经脉冲在细胞间通过神经递质传输。神经递质被树突接收后,相应的神经信号传给细胞体,由细胞体进行处理并积累。当积累神经递质的兴奋性超过了某个阈值,就会触发一个动作电位,将新的信号传至轴突末梢的突触,释放神经递质给下一个神经元。生物的智能、运动等几乎所有生命活动的控制信号都由这些看似简单的神经元进行传输。
Francek Chen
2025/01/22
3210
【机器学习-监督学习】神经网络与多层感知机
多层感知机
多层感知机就是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换,多层感知机的层数个各个隐藏层中隐藏单元个数都是超参数,输出可以通过以下公式计算得出:
村雨遥
2022/06/15
6400
多层感知机
【深度学习基础】多层感知机 | 多层感知机概述
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
3280
【深度学习基础】多层感知机 | 多层感知机概述
动手学DL——MLP多层感知机【深度学习】【PyTorch】
加入一个或多个隐藏层+激活函数来克服线性模型的限制, 使其能处理更普遍的函数关系类型,这种架构通常称为多层感知机(multilayer perceptron)。
来杯Sherry
2023/08/10
1.6K0
动手学DL——MLP多层感知机【深度学习】【PyTorch】
【动手学深度学习笔记】之多层感知机(MLP)
多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。如图所示的隐藏层一共有5个隐藏单元。由于输入层不涉及计算,因此这个多层感知机的层数为2。如图所示的多层感知机中的隐藏层和输出层都是全连接层。
树枝990
2020/08/20
2.9K0
从0到1,实现你的第一个多层神经网络
多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。如图所示的隐藏层一共有5个隐藏单元。由于输入层不涉及计算,因此这个多层感知机的层数为2。如图所示的多层感知机中的隐藏层和输出层都是全连接层。
树枝990
2020/08/19
7880
【深度学习基础】多层感知机 | 多层感知机的实现
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/01/22
1570
【深度学习基础】多层感知机 | 多层感知机的实现
深度学习前置知识
由于单层的感知机模型的表达能力很差,只能表示线性模型,连最简单的 XOR 函数模型都无法表示,所以出现了多层感知机模型,加入了隐藏层,最简单的多层感知机模型有三层,分别为输入层、隐藏层、输出层,其中隐藏层的元素个数和层数是超参数(即自定义的),如下图所示:
Here_SDUT
2022/09/19
1.5K0
深度学习前置知识
「Workshop」第二十九期 深度学习入门
感知机接受多个信号(x1,x2),输出一个信号(y), w1/w2是权重,圆圈就代表神经元
王诗翔呀
2021/01/04
7320
「Workshop」第二十九期 深度学习入门
从零开始学Pytorch(五)之欠拟合和过拟合
训练误差(training error)指模型在训练数据集上表现出的误差,泛化误差(generalization error)指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
墨明棋妙27
2022/09/23
9040
多层感知机实现(单层感知器和多层感知器)
前面利用了softmax来对图像进行分类,也可以使用多层感知机的方法对图像进行分类。
全栈程序员站长
2022/07/31
1.2K0
多层感知机实现(单层感知器和多层感知器)
【现代深度学习技术】现代卷积神经网络05:批量规范化
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/03/31
1430
【现代深度学习技术】现代卷积神经网络05:批量规范化
机器学习|深度学习基础知识
最近在看深度学习的一些资料,发现有些基础知识比较模糊,于是重新整理了一下深度学习的基础知识。
用户1904552
2025/02/27
980
机器学习|深度学习基础知识
【动手学深度学习笔记】之多层感知机实现
Fashion-MNIST数据集中的图像为28*28像素,也就是由784个特征值。Fashion-MNIST数据集一共有十个类别。因此模型需要784个输入,10个输出。假设隐藏单元为256(超参数,可调节)。
树枝990
2020/08/19
6430
【现代深度学习技术】卷积神经网络06:卷积神经网络(LeNet)
深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重要的技术特征是具有自动提取特征的能力。神经网络算法、算力和数据是开展深度学习的三要素。深度学习在计算机视觉、自然语言处理、多模态数据分析、科学探索等领域都取得了很多成果。本专栏介绍基于PyTorch的深度学习算法实现。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/PyTorch_deep_learning。
Francek Chen
2025/03/12
1750
【现代深度学习技术】卷积神经网络06:卷积神经网络(LeNet)
神经网络入门基础知识
1943年心理学家W.S. McCulloch和数理逻辑学家W.Pitts研究出人工神经元,称为M-Р模型。
timerring
2023/07/05
1.8K0
神经网络入门基础知识
动手学深度学习(四) 过拟合欠拟合及其解决方案
在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
致Great
2020/02/25
1.3K0
动手学深度学习(四) 过拟合欠拟合及其解决方案
推荐阅读
相关推荐
动手学深度学习(三) 多层感知机
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验