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开窗函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot与React集成的示例代码

    Spring Boot与React集成的示例代码

    这篇文章主要介绍了Spring Boot与React集成的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Spring中@PropertySource的使用方法和运行原理详解

    Spring中@PropertySource的使用方法和运行原理详解

    这篇文章主要介绍了Spring中@PropertySource的使用方法和运行原理详解,PropertySource注解可以方便和灵活的向Spring的环境容器(org.springframework.core.env.Environment Environment)中注入一些属性,这些属性可以在Bean中使用,需要的朋友可以参考下
    2023-11-11
  • Mybatis choose when用法实例代码

    Mybatis choose when用法实例代码

    本文通过实例代码给大家介绍了Mybatis choose when用法,需要的的朋友参考下吧
    2017-06-06
  • Java NIO实战之聊天室功能详解

    Java NIO实战之聊天室功能详解

    这篇文章主要介绍了Java NIO实战之聊天室功能,结合实例形式详细分析了java NIO聊天室具体的服务端、客户端相关实现方法与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • Spring Boot使用LocalDateTime、LocalDate作为入参的方案详解

    Spring Boot使用LocalDateTime、LocalDate作为入参的方案详解

    这篇文章主要介绍了Spring Boot使用LocalDateTime、LocalDate作为入参,本文基于Springboot2.0测试,如果无法生效可能是spring版本较低导致的,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Spring使用注解方式处理事务

    Spring使用注解方式处理事务

    这篇文章主要为大家详细介绍了Spring使用注解方式处理事务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java提示缺少返回语句的解决办法

    Java提示缺少返回语句的解决办法

    在本篇文章里小编给大家分享了关于Java提示缺少返回语句的解决办法以及相关知识点,需要的朋友们参考下。
    2019-07-07
  • springboot 设置局域网访问的实现步骤

    springboot 设置局域网访问的实现步骤

    Spring Boot是一个开源Java-based框架,用于创建独立的、生产级别的Spring应用,它旨在简化Spring应用的初始搭建及开发过程,通过提供各种自动配置的starter包,Spring Boot使得项目配置变得简单快速,感兴趣的朋友一起看看吧
    2024-02-02
  • java实现二分法的完整代码

    java实现二分法的完整代码

    这篇文章主要为大家详细介绍了java实现二分法的完整代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Java多线程基本概念以及避坑指南

    Java多线程基本概念以及避坑指南

    多线程之于进程的理解,可以类比多进程之于操作系统,多线程指在单个程序中可以同时运行多个不同的线程执行不同的任务,这篇文章主要给大家介绍了关于Java多线程基本概念以及避坑指南的相关资料,需要的朋友可以参考下
    2021-09-09

最新评论