点击蓝字关注!

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

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

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

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

1

over关键字

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

举个栗子

数据集:销售表

dep_no
部门
series_code
商品类型
code_sales_num
销售数量

业务场景

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

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

--计算总数 总数为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

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:

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

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

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:以下两个窗口的语义相同

-- 窗口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如下:

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:

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:

select device_id, device_time, status,
lag(status) over(partition by device_id order by device_time) as lag_status
from temp_status;

完整的统计HQL如下:

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

执行结果

 Hive常见的窗口函数你会了么?

扫码二维码

获取历史文章

Eights

喜欢本文就点个在看吧~

Hive常用窗口函数实战相关推荐

  1. MySQL/Hive 常用窗口函数详解及相关面试题

    目录 一.窗口函数概述: 1.窗口函数的分类 2.窗口函数与普通聚合函数的区别: 二.窗口函数的基本用法 1.基本语法 2.设置窗口的方法 1)window_name 2) partition by ...

  2. HIVE:窗口函数,用sql语句查询MySQL安装路径和版本

    数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...

  3. Hive分析窗口函数系列文章

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  4. hive的窗口函数详解

    1.1 hive窗口函数 窗口函数是什么鬼? 窗口函数指定了函数工作的数据窗口大小(当前行的上下多少行),这个数据窗口大小可能会随着行的变化而变化.窗口函数和聚合函数区别? 窗口函数对于每个组返回多行 ...

  5. hive常用函数(一)

    hive常用函数一般分为下面几个部分: 算数运算符:+,- ,*, / 关系运算符:== , <>(不等于) , > , >= , < , <= 逻辑运算符:and ...

  6. HIVE 常用函数总结

    HIVE 常用函数总结 hive 函数比较多,之前总是随用随查,今天把常用的函数总结一下,以后方便查阅. 本文主要涉及以下几个大面: 1.Hive函数介绍以及内置函数查看 内容较多,见<Hive ...

  7. Hive分析窗口函数

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  8. Hive常用函数、列转行与行转列、开窗函数、UDF、UDTF

    Hive函数.开窗函数.UDF.UDTF 1.系统内置函数 2.常用函数 2.1.关系运算 2.2.数值运算 2.3.条件函数 2.4.日期函数 2.5.字符串函数 2.6.Hive求WordCoun ...

  9. 使用Hive的窗口函数进行数据分析——以股票市场分析为例

    声明:本文主要是实现利用Hive常用的窗口函数和一些数据分析思维分析数据,只是套用在股票数据的例子上,因此并不适用于提高投资技巧! 我们先看一下常用Hive中常用的窗口: PRECEDING:往前 F ...

最新文章

  1. [FZSZOJ 1029] 观察者加强版
  2. JAVA项目实训struts2_Java Web项目搭建过程记录(struts2)
  3. 数据结构与算法—栈详解
  4. Weave Scope安装
  5. 2022 年“苹果学者”名单公布,4 位华人学生位列其中
  6. ef mysql 读写分离_基于 EntityFramework 的数据库主从读写分离服务插件
  7. thymeleaf的url属性
  8. String写时拷贝实现
  9. 怎样修改安卓位置服务器,修改安卓定位服务器地址
  10. 2020张宇1000题【好题收集】【第七章:三重积分、曲线曲面积分】
  11. php源代码压缩,代码压缩工具_PHP 源代码压缩小工具
  12. 工业相机镜头 参数概念
  13. ubantu18-ROS环境下配置IMU(STIM300),含驱动下载安装与硬件配置。
  14. 陈伟星“VVShare打车链”,打造区块链经济共享平台
  15. 应用程序“Parallels Desktop“无法打开MAC电脑打不开
  16. 2021年好用的几款大数据分析工具
  17. Oracle基本命令符
  18. 菜鸟Python实战-03爬虫之爬取数据
  19. python基础与爬虫笔记
  20. 3款大屏播放软件,用法很详细,用于大屏幕播放视频和图片

热门文章

  1. Mysql索引有哪几种类型
  2. Spring--官方文档部分翻译(第五章 面向Aspect的编程-AOP)
  3. java简单学生成绩系统_JAVA 实现简单的学生成绩管理系统
  4. Array.prototype.pop()
  5. VS Warring
  6. 17.机器比人更需要通证
  7. 用 Python 写一个俄罗斯方块游戏
  8. Java周末舞会算法
  9. 【程序人生】“阶段总结“-幕天席地
  10. 关键链法vs关键路径法