文章目录

  • 开窗函数介绍
  • 开窗函数使用语法
  • 开窗函数代码示例

开窗函数介绍

  • 开窗函数的引入是为了既显示聚合前的数据,又显示聚合后的数据。即在每一行的最后一列添加聚合函数的结果。开窗用于为定义一个窗口(指运算将要操作的行的集合),它对一组值进行操作,不需要使用Group BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
  • 聚合函数和开窗函数的区别:
    • 聚合函数是多行变一行;如果要显示其他列必须加入到group by中。
    • 开窗函数是一行变多行;不需要加group by就可以将所有信息显示出来。
  • 开窗函数分类:
    • 聚合开窗函数:聚合函数(col) + OVER()。
    • 排序开窗函数:排序函数(col) + OVER()。
    • 分区类型NTILE开窗函数:NTILE(num) + OVER()。

开窗函数使用语法

  • 聚合类型
sum()/count()/avg()/max()/min() OVER([PARTITION BY XXX] [ORDER BY XXX [DESC]])
  • 排序类型
ROW_NUMBER() OVER([PARTITION BY XXX] [ORDER BY XXX [DESC]])
  • 分区类型
NTILE(num) OVER([PARTITION BY XXX] [ORDER BY XXX [DESC]])

开窗函数代码示例

# coding : utf8
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StringType, IntegerType, FloatType, ArrayType
from pyspark.sql import functions as Fif __name__ == '__main__':ss = SparkSession.builder \.appName("test") \.master("local[*]") \.getOrCreate()sc = ss.sparkContextrdd_dota = sc.parallelize([('AME', 'LGD', 90),('YATORO', 'TS', 95),('Yuragi', 'OG', 88),('miCKe', 'Liquid', 95),('Monet', 'Aster', 90),('K1', 'BC', 90),('RTZ', 'EG', 85),('Crystallis', 'Secret', 60),('NTS', 'LGD', 70),('TorontoTokyo', 'TS', 75),('bzm', 'OG', 90),('Nisha', 'Liquid', 97),('Ori', 'Aster', 82),('DarkMago', 'BC', 79),('Abed', 'EG', 86),('Boom', 'Secret', 77),('Topson', 'OLDG', 99),('Noone', 'OLDG', 89)])schema = StructType().add("Player", StringType()) \.add("Team", StringType()) \.add("Score", IntegerType())dota_df = rdd_dota.toDF(schema)dota_df.createTempView("dota_player")# TODO :聚合函数ss.sql('''SELECT *, AVG(Score) OVER(PARTITION BY Team) AS avg_score FROM dota_player''').show()+------------+------+-----+---------+
|      Player|  Team|Score|avg_score|
+------------+------+-----+---------+
|       Monet| Aster|   90|     86.0|
|         Ori| Aster|   82|     86.0|
|          K1|    BC|   90|     84.5|
|    DarkMago|    BC|   79|     84.5|
|         RTZ|    EG|   85|     85.5|
|        Abed|    EG|   86|     85.5|
|         AME|   LGD|   90|     80.0|
|         NTS|   LGD|   70|     80.0|
|       miCKe|Liquid|   95|     96.0|
|       Nisha|Liquid|   97|     96.0|
|      Yuragi|    OG|   88|     89.0|
|         bzm|    OG|   90|     89.0|
|      Topson|  OLDG|   99|     94.0|
|       Noone|  OLDG|   89|     94.0|
|  Crystallis|Secret|   60|     68.5|
|        Boom|Secret|   77|     68.5|
|      YATORO|    TS|   95|     85.0|
|TorontoTokyo|    TS|   75|     85.0|
+------------+------+-----+---------+# TODO :排序窗口ss.sql('''SELECT *, ROW_NUMBER() OVER(ORDER BY Score DESC )  AS row_number_rank,DENSE_RANK() OVER(PARTITION BY Team ORDER BY Score DESC ) AS  dense_rank,RANK() OVER(ORDER BY Score) AS  rankFROM dota_player''').show()+------------+------+-----+---------------+----------+----+
|      Player|  Team|Score|row_number_rank|dense_rank|rank|
+------------+------+-----+---------------+----------+----+
|       Monet| Aster|   90|              6|         1|  11|
|         Ori| Aster|   82|             13|         2|   6|
|          K1|    BC|   90|              7|         1|  11|
|    DarkMago|    BC|   79|             14|         2|   5|
|        Abed|    EG|   86|             11|         1|   8|
|         RTZ|    EG|   85|             12|         2|   7|
|         AME|   LGD|   90|              5|         1|  11|
|         NTS|   LGD|   70|             17|         2|   2|
|       Nisha|Liquid|   97|              2|         1|  17|
|       miCKe|Liquid|   95|              4|         2|  15|
|         bzm|    OG|   90|              8|         1|  11|
|      Yuragi|    OG|   88|             10|         2|   9|
|      Topson|  OLDG|   99|              1|         1|  18|
|       Noone|  OLDG|   89|              9|         2|  10|
|        Boom|Secret|   77|             15|         1|   4|
|  Crystallis|Secret|   60|             18|         2|   1|
|      YATORO|    TS|   95|              3|         1|  15|
|TorontoTokyo|    TS|   75|             16|         2|   3|
+------------+------+-----+---------------+----------+----+# TODO :NTILE分区ss.sql('''SELECT *, NTILE(4) OVER(ORDER BY Score DESC) AS ntile FROM dota_player''').show()+------------+------+-----+-----+
|      Player|  Team|Score|ntile|
+------------+------+-----+-----+
|      Topson|  OLDG|   99|    1|
|       Nisha|Liquid|   97|    1|
|      YATORO|    TS|   95|    1|
|       miCKe|Liquid|   95|    1|
|         AME|   LGD|   90|    1|
|       Monet| Aster|   90|    2|
|          K1|    BC|   90|    2|
|         bzm|    OG|   90|    2|
|       Noone|  OLDG|   89|    2|
|      Yuragi|    OG|   88|    2|
|        Abed|    EG|   86|    3|
|         RTZ|    EG|   85|    3|
|         Ori| Aster|   82|    3|
|    DarkMago|    BC|   79|    3|
|        Boom|Secret|   77|    4|
|TorontoTokyo|    TS|   75|    4|
|         NTS|   LGD|   70|    4|
|  Crystallis|Secret|   60|    4|
+------------+------+-----+-----+

SparkSQL 实现窗口函数相关推荐

  1. PySpark | SparkSQL函数 | SparkSQL运行流程

    文章目录 一.SparkSQL函数定义 1. SparkSQL 定义UDF函数 1.1 UDF函数的创建 1.2 注册返回值是数组类型的UDF 1.3 注册返回是字典类型的UDF对象 1.4 通过RD ...

  2. pyspark及Spark报错问题汇总及某些函数用法。

    此贴,主要记录本人在工作中遇到的某些报错问题,并提出自己的解决办法. 1. spark = SparkSession.builder()  TypeError: 'Builder' object is ...

  3. [学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程

    文章目录 视频资料: 思维导图 一.Spark基础入门(环境搭建.入门概念) 第二章:Spark环境搭建-Local 2.1 课程服务器环境 2.2 Local模式基本原理 2.3 安装包下载 2.4 ...

  4. 【遇见Doris】Doris基于Hive表的全局字典设计与实现

    感谢7月25日来参加 Doris 与 Dolphin Scheduler 合作举办的线上 Meetup 的小伙伴们,现在为大家带来 Meetup 的内容. 本次 Meetup 请到了来自百度.奇安信. ...

  5. SparkSQL(13): 窗口函数和group by执行顺序

    一.实现功能 当sql中既有groupby又有窗口函数,那么两者的执行顺序是什么样?这个特此研究一下,方便后续有使用的时候会方便. 二.实际例子 3.1案例数据 /opt/datas/score.js ...

  6. SparkSQL函数定义——UDF函数,窗口函数

    目录 1 定义UDF函数 1.1  返回值是数组类型的UDF定义 1.2 返回字典类型的UDF定义 2 窗口函数 1 定义UDF函数 目前python仅支持UDF 两种定义方式: 1. sparkse ...

  7. 2021年大数据Spark(二十九):SparkSQL案例四开窗函数

    目录 案例四:开窗函数 概述 介绍 聚合函数和开窗函数 开窗函数分类 ​​​​​​​聚合开窗函数 排序开窗函数 ROW_NUMBER顺序排序 ​​​​​​​RANK跳跃排序 ​​​​​​​ DENSE ...

  8. SparkSql官方文档中文翻译(java版本)

    1 概述(Overview) 2 DataFrames 2.1 入口:SQLContext(Starting Point: SQLContext) 2.2 创建DataFrames(Creating ...

  9. hive窗口函数_Hive sql窗口函数源码分析

    在了解了窗口函数实现原理 spark.hive中窗口函数实现原理复盘 和 sparksql比hivesql优化的点(窗口函数)之后,今天又撸了一遍hive sql 中窗口函数的源码实现,写个笔记记录一 ...

最新文章

  1. Sicily 1153: 马的周游问题(DFS+剪枝)
  2. python颜色库_Python可视化_matplotlib08-palettable颜色库(四)
  3. Idea自带的工具打jar包和Maven打Jar包(SpringBoot工程)
  4. Vim安装插件在命令行下看代码
  5. .net core consul 服务配置 服务发现 服务健康检测 服务变更加载
  6. Loader 知识梳理(2) initLoader和restartLoader的区别
  7. java对象布局查看工具_Java 查看对象布局工具 - Java Object Layout
  8. java arraylist
  9. sql server死锁_SQL Server死锁定义和概述
  10. windows上安装Metasploit Framework 4.0
  11. JSOI2007 文本生成器
  12. codematic2连接mysql失败_动软代码生成器Codematic
  13. QT学习之QQ聊天案例
  14. 杭州电子科技大学ACM1020 JAVA
  15. 管理中的“鲶鱼效应”
  16. 笔试题??智商题??
  17. 人事管理系统之部门结构树的展示
  18. 超低功耗MCU如何降低功耗
  19. 说说 褥羊毛和薅羊毛的那些事
  20. studio 和mac快捷键

热门文章

  1. Error: getaddrinfo ENOENT报错解决
  2. sort()函数详解
  3. 将bolg同时部署到Github和coding
  4. Android LayoutParams源码分析
  5. HYSBZ - 1017 魔兽地图【树形DP依赖性背包】
  6. Windows 意外结束掉 explorer.exe 进程,导致整个电脑屏幕黑屏
  7. 以每行5个数输出fib前20 c语言循环,打印Fibonacci数列方法汇总(前20项,每行5个)...
  8. 快递查询方法,教你一次性查询全部单号物流并进行筛选
  9. 健康问答语料的爬虫(C#)
  10. Factorization Meets the Neighborhood: a MultifacetedCollaborative Filtering Model 阅读笔记