SparkSQL开窗函数分析使用示例
作者:健鑫. 发布时间:2022-04-16 02:26:32
标签:SparkSQL,开窗,窗口
开窗函数能在每行的最后一行都显示聚合函数的结果,所以聚合函数可以用作开窗函数
聚合函数和开窗函数
聚合函数是将多行变成一行,如果要显示其他列,必须将列加入group by
开窗函数是将一行变成多行,将所有的信息显示出来
开窗函数
聚合开窗函数
聚合函数 over(partition by子句)
over关键字将聚合函数当作聚合开窗函数
SQL标准允许所有的聚合函数用作聚合开窗函数
示例:
// spark.sql("select id, name, age, count(name) from person").show 报错
spark.sql("select id, name, age, count(name)over() sum from person").show
/*
* +---+----+---+---+
| id|name|age|sum|
+---+----+---+---+
| 1| jx| 20| 6|
| 2| zx| 21| 6|
| 3| wz| 33| 6|
| 4| qw| 11| 6|
| 5| aa| 22| 6|
| 6| aq| 45| 6|
+---+----+---+---+
*
* */
over后面的括号还可以改变聚合函数的窗口范围
如果over后面的括号为空,则开窗函数会对所有行进行聚合运算
over后面的括号里可以用partition by 来定义行的分区来进行聚合运算
partition by进行分区之后,计算当前分区的聚合计算的结果
spark.sql("select id, name, age, area_id, count(name)over(partition by area_id) sum from person").show
/*
+---+----+---+-------+---+
| id|name|age|area_id|sum|
+---+----+---+-------+---+
| 1| jx| 20| 1| 3|
| 2| zx| 21| 1| 3|
| 3| wz| 33| 1| 3|
| 5| aa| 22| 3| 2|
| 6| aq| 45| 3| 2|
| 4| qw| 11| 2| 1|
+---+----+---+-------+---+
*
* */
排序开窗函数
ROW_NUMBER顺序排序
row_number() over(order by score)
排序开窗函数中使用partition by 需要放置在order by之前
实例
spark.sql("select id, name, age, area_id, row_number() over(order by age) rank from person").show
spark.sql("select id, name, age, area_id, row_number() over(partition by area_id order by age) rank from person").show
/*
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 4| qw| 11| 2| 1|
| 1| jx| 20| 1| 2|
| 2| zx| 21| 1| 3|
| 5| aa| 22| 3| 4|
| 3| wz| 33| 1| 5|
| 6| aq| 45| 3| 6|
+---+----+---+-------+----+
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 1| jx| 20| 1| 1|
| 2| zx| 21| 1| 2|
| 3| wz| 33| 1| 3|
| 5| aa| 22| 3| 1|
| 6| aq| 45| 3| 2|
| 4| qw| 11| 2| 1|
+---+----+---+-------+----+
*
* */
RANK跳跃排序
rank() over(order by)
使用该函数排序求出来的结果可以并列
示例
spark.sql("select id, name, age, area_id, rank() over(order by age) rank from person").show
spark.sql("select id, name, age, area_id, rank() over(partition by area_id order by age) rank from person").show
/*
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 4| qw| 10| 2| 1|
| 1| jx| 20| 1| 2|
| 2| zx| 20| 1| 2|
| 5| aa| 22| 3| 4|
| 7| qq| 22| 3| 4|
| 3| wz| 33| 1| 6|
| 6| aq| 45| 3| 7|
+---+----+---+-------+----+
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 1| jx| 20| 1| 1|
| 2| zx| 20| 1| 1|
| 3| wz| 33| 1| 3|
| 5| aa| 22| 3| 1|
| 7| qq| 22| 3| 1|
| 6| aq| 45| 3| 3|
| 4| qw| 10| 2| 1|
+---+----+---+-------+----+
*
* */
DENSE_RANK连续排序
dense_rank() over(order by )
使用该函数,并列排名之后的排序+1
示例
spark.sql("select id, name, age, area_id, dense_rank() over(order by age) rank from person").show
spark.sql("select id, name, age, area_id, dense_rank() over(partition by area_id order by age) rank from person").show
/*
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 4| qw| 10| 2| 1|
| 1| jx| 20| 1| 2|
| 2| zx| 20| 1| 2|
| 5| aa| 22| 3| 3|
| 7| qq| 22| 3| 3|
| 3| wz| 33| 1| 4|
| 6| aq| 45| 3| 5|
+---+----+---+-------+----+
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 1| jx| 20| 1| 1|
| 2| zx| 20| 1| 1|
| 3| wz| 33| 1| 2|
| 5| aa| 22| 3| 1|
| 7| qq| 22| 3| 1|
| 6| aq| 45| 3| 2|
| 4| qw| 10| 2| 1|
+---+----+---+-------+----+
*
* */
NTILE分组排序
ntile(6) over(order by) // 表示分成六个组,显示每个组的序号
spark.sql("select id, name, age, area_id, ntile(4) over(order by age) rank from person").show
spark.sql("select id, name, age, area_id, ntile(4) over(partition by area_id order by age) rank from person").show
/*
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 4| qw| 10| 2| 1|
| 1| jx| 20| 1| 1|
| 2| zx| 20| 1| 2|
| 5| aa| 22| 3| 2|
| 7| qq| 22| 3| 3|
| 3| wz| 33| 1| 3|
| 6| aq| 45| 3| 4|
+---+----+---+-------+----+
+---+----+---+-------+----+
| id|name|age|area_id|rank|
+---+----+---+-------+----+
| 1| jx| 20| 1| 1|
| 2| zx| 20| 1| 2|
| 3| wz| 33| 1| 3|
| 5| aa| 22| 3| 1|
| 7| qq| 22| 3| 2|
| 6| aq| 45| 3| 3|
| 4| qw| 10| 2| 1|
+---+----+---+-------+----+
*
* */
来源:https://blog.csdn.net/weixin_62759952/article/details/128718317


猜你喜欢
- Zuul 简介Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/admin 转发到到 Admin 服务,/a
- 目录前言继承Thread实现Runnale接口Callable线程池常见的4种线程池。总结前言在java中,如果每个请求到达就创建一个新线程
- 模拟ThreadLocal类实现:线程范围内的共享变量,每个线程只能访问他自己的,不能访问别的线程。package com.ljq.test
- 前言我们在首次使用内容类 App 的时候,不少都会让我们选择个人偏好。这种通常是通过标签来实现,比如列举出一系列的技术栈,然后让我们选择。通
- classpath读取resources目录下文件最近在springboot+maven的项目中去读取资源文件的时候,报了找不到文件的错误。
- 一、setting.xml文件的位置今天我们来谈谈Maven setting文件配置的禅定之道。不知道大家有没有听说过禅宗?嗯,没错,就是那
- 本文以实例代码实现了C#根据数字序号输出星期几,用户可通过输入数字0~6,输出星期各天的英语单词,程序中主要是演示if语句和switch语句
- 随机数的定义为:产生的所有数字毫无关系.在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号.在C#中获取随机数有三种方法:一.Ran
- 本文实例为大家分享了android九宫格可分页加载控件的具体实现代码,供大家参考,具体内容如下github地址基本思路是viewpager+
- 静态数组Java中最基本的数组大家肯定不会陌生:int[] array = new int[6];for (int i = 0; i <
- idea中创建一个maven项目在pom文件中导入下面的依赖<!--mybatis核心包--> <depend
- JAVA枚举,比你想象中还要有用!我经常发现自己在Java中使用枚举来表示某个对象的一组潜在值。在编译时确定类型可以具有什么值的能力是一种强
- b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的
- package com.chen.lucene.image;import java.io.File;import java.io.FileI
- 问题描述:解决:检查以上是否版本一致。不行就再检查下面的:如果上面的方法还是不行的话,就建议你改一下pom文件中的maven插件编译级别,可
- 本文实例讲述了Android viewpager中动态添加view并实现伪无限循环的方法。分享给大家供大家参考,具体如下:viewpager
- 本文实例讲述了java数据结构与算法之冒泡排序。分享给大家供大家参考,具体如下:前面文章讲述的排序算法都是基于插入类的排序,这篇文章开始介绍
- 负载均衡使用微服务后,为了能够承担高并发的压力,同一个服务可能会启动多个实例。这时候消费者就需要负载均衡,把请求分散到各个实例。负载均衡主要
- java向文件中追加内容与读写文件内容源码实例代码向文件尾加入内容有多种方法,常见的方法有两种:RandomAccessFile类可以实现随
- 有时候,我们需要制作一个Word模板文档,然后发给用户填写,但我们希望用户只能在指定位置填写内容,其他内容不允许编辑和修改。这时候我们就可以