SparkSQL开窗函数分析使用示例

 更新时间:2023年01月20日 10:49:37   作者:健鑫.  
开窗函数的引入是为了既显示聚集前的数据,又显示聚集后的数据。即在每一行的最后一列添加聚合函数的结果。开窗用于为行定义一个窗口,它对一组值进行操作,不需要使用 GROUP BY 子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列

开窗函数能在每行的最后一行都显示聚合函数的结果,所以聚合函数可以用作开窗函数

聚合函数和开窗函数

聚合函数是将多行变成一行,如果要显示其他列,必须将列加入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|
+---+----+---+-------+----+
*
* */

到此这篇关于SparkSQL开窗函数分析使用示例的文章就介绍到这了,更多相关SparkSQL开窗函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java编程中向量(Vector)的应用

    详解Java编程中向量(Vector)的应用

    这篇文章主要介绍了Java中的向量(Vector)的应用,Vector也是Java中比较常用的一个类,需要的朋友可以参考下
    2015-10-10
  • 基于springboot服务间Feign调用超时的解决方案

    基于springboot服务间Feign调用超时的解决方案

    这篇文章主要介绍了基于springboot服务间Feign调用超时的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java经典面试题最全汇总208道(三)

    Java经典面试题最全汇总208道(三)

    这篇文章主要介绍了Java经典面试题最全汇总208道(三),本文章内容详细,该模块分为了六个部分,本次为第三部分,需要的朋友可以参考下
    2023-01-01
  • Java AQS中ReentrantReadWriteLock读写锁的使用

    Java AQS中ReentrantReadWriteLock读写锁的使用

    ReentrantReadWriteLock称为读写锁,它提供一个读锁,支持多个线程共享同一把锁。这篇文章主要讲解一下ReentrantReadWriteLock的使用和应用场景,感兴趣的可以了解一下
    2023-02-02
  • springboot2学习世界著名程序springboot开发体验

    springboot2学习世界著名程序springboot开发体验

    这篇文章主要为大家介绍了世界著名程序springboot开发体验,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • 详解Java中用于国际化的locale类

    详解Java中用于国际化的locale类

    Java中也有用于转换和划分地区的国际化类java.lang.Locale,国际化在程序中设置语言和时间等时非常有用,下面我们就来详解Java中用于国际化的locale类
    2016-06-06
  • Java中常见的并发控制手段浅析

    Java中常见的并发控制手段浅析

    所谓并发控制就是帮助我们程序员更容易的让线程之间合作,让线程之间相互配合来满足业务逻辑,这篇文章主要给大家介绍了关于Java中常见的并发控制手段的相关资料,需要的朋友可以参考下
    2021-08-08
  • 简单讲解Java的Socket网络编程的多播与广播实现

    简单讲解Java的Socket网络编程的多播与广播实现

    这篇文章主要介绍了Java的Socket网络编程的多播与广播实现,包括网络编程发送和接受数据的一些基础知识整理,需要的朋友可以参考下
    2016-01-01
  • springboot的jar包如何启用外部配置文件

    springboot的jar包如何启用外部配置文件

    本文主要介绍了springboot的jar包如何启用外部配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • SpringBoot用配置影响Bean加载@ConditionalOnProperty

    SpringBoot用配置影响Bean加载@ConditionalOnProperty

    这篇文章主要为大家介绍了SpringBoot用配置影响Bean加载@ConditionalOnProperty示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论