SparkSQL 实现窗口函数
文章目录
- 开窗函数介绍
- 开窗函数使用语法
- 开窗函数代码示例
开窗函数介绍
- 开窗函数的引入是为了既显示聚合前的数据,又显示聚合后的数据。即在每一行的最后一列添加聚合函数的结果。开窗用于为定义一个窗口(指运算将要操作的行的集合),它对一组值进行操作,不需要使用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 实现窗口函数相关推荐
- PySpark | SparkSQL函数 | SparkSQL运行流程
文章目录 一.SparkSQL函数定义 1. SparkSQL 定义UDF函数 1.1 UDF函数的创建 1.2 注册返回值是数组类型的UDF 1.3 注册返回是字典类型的UDF对象 1.4 通过RD ...
- pyspark及Spark报错问题汇总及某些函数用法。
此贴,主要记录本人在工作中遇到的某些报错问题,并提出自己的解决办法. 1. spark = SparkSession.builder() TypeError: 'Builder' object is ...
- [学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程
文章目录 视频资料: 思维导图 一.Spark基础入门(环境搭建.入门概念) 第二章:Spark环境搭建-Local 2.1 课程服务器环境 2.2 Local模式基本原理 2.3 安装包下载 2.4 ...
- 【遇见Doris】Doris基于Hive表的全局字典设计与实现
感谢7月25日来参加 Doris 与 Dolphin Scheduler 合作举办的线上 Meetup 的小伙伴们,现在为大家带来 Meetup 的内容. 本次 Meetup 请到了来自百度.奇安信. ...
- SparkSQL(13): 窗口函数和group by执行顺序
一.实现功能 当sql中既有groupby又有窗口函数,那么两者的执行顺序是什么样?这个特此研究一下,方便后续有使用的时候会方便. 二.实际例子 3.1案例数据 /opt/datas/score.js ...
- SparkSQL函数定义——UDF函数,窗口函数
目录 1 定义UDF函数 1.1 返回值是数组类型的UDF定义 1.2 返回字典类型的UDF定义 2 窗口函数 1 定义UDF函数 目前python仅支持UDF 两种定义方式: 1. sparkse ...
- 2021年大数据Spark(二十九):SparkSQL案例四开窗函数
目录 案例四:开窗函数 概述 介绍 聚合函数和开窗函数 开窗函数分类 聚合开窗函数 排序开窗函数 ROW_NUMBER顺序排序 RANK跳跃排序 DENSE ...
- SparkSql官方文档中文翻译(java版本)
1 概述(Overview) 2 DataFrames 2.1 入口:SQLContext(Starting Point: SQLContext) 2.2 创建DataFrames(Creating ...
- hive窗口函数_Hive sql窗口函数源码分析
在了解了窗口函数实现原理 spark.hive中窗口函数实现原理复盘 和 sparksql比hivesql优化的点(窗口函数)之后,今天又撸了一遍hive sql 中窗口函数的源码实现,写个笔记记录一 ...
最新文章
- Sicily 1153: 马的周游问题(DFS+剪枝)
- python颜色库_Python可视化_matplotlib08-palettable颜色库(四)
- Idea自带的工具打jar包和Maven打Jar包(SpringBoot工程)
- Vim安装插件在命令行下看代码
- .net core consul 服务配置 服务发现 服务健康检测 服务变更加载
- Loader 知识梳理(2) initLoader和restartLoader的区别
- java对象布局查看工具_Java 查看对象布局工具 - Java Object Layout
- java arraylist
- sql server死锁_SQL Server死锁定义和概述
- windows上安装Metasploit Framework 4.0
- JSOI2007 文本生成器
- codematic2连接mysql失败_动软代码生成器Codematic
- QT学习之QQ聊天案例
- 杭州电子科技大学ACM1020 JAVA
- 管理中的“鲶鱼效应”
- 笔试题??智商题??
- 人事管理系统之部门结构树的展示
- 超低功耗MCU如何降低功耗
- 说说 褥羊毛和薅羊毛的那些事
- studio 和mac快捷键
热门文章
- Error: getaddrinfo ENOENT报错解决
- sort()函数详解
- 将bolg同时部署到Github和coding
- Android LayoutParams源码分析
- HYSBZ - 1017 魔兽地图【树形DP依赖性背包】
- Windows 意外结束掉 explorer.exe 进程,导致整个电脑屏幕黑屏
- 以每行5个数输出fib前20 c语言循环,打印Fibonacci数列方法汇总(前20项,每行5个)...
- 快递查询方法,教你一次性查询全部单号物流并进行筛选
- 健康问答语料的爬虫(C#)
- Factorization Meets the Neighborhood: a MultifacetedCollaborative Filtering Model 阅读笔记