spark window源码探索

news2025/1/12 3:03:09

核心类:

1. WindowExec 物理执行逻辑入口,主要doExecute()和父类WindowExecBase

2. WindowFunctionFrame 窗框执行抽象,其子类对应sql语句的不同窗框

其中又抽象出BoundOrdering类, 用于判断一行是否在界限内(Bound), 分为RowBoundOrdering和RangeBoundOrdering

我们的UDAF在何时已什么顺序接受数据, 何时会被执行eval, 都取决于窗框内方法调用逻辑!

3. AggregateProcessor 负责调用一个frame下的各个窗口函数, 起着包装/代理的功能

AggregateProcessor中三个关键方法: initialize, update, evaluate, 里面都是去调用具体Function的对应方法

4. WindowExpression:窗口函数表达式,将一个表达式和一个窗口规范关联起来,用于在数据集的窗口上进行计算

代码流程

WindowExec这个类是物理执行逻辑入口,它有一个父类WindowExecBase

1. 在这里可以看到如果有partition关键字,就是hashpartition,没有partition by就会是singlepartition

2. 再看聚合的类 AggregateProcessor,明确说明了窗口函数只会使用Complete聚合模式,也就是说窗口操作,相同key的数据一定在同一分区,所以window函数的性能是比group要差的

回到WindowExec,我们再来看doExecute()做了什么 

首先windowFrameExpressionFactoryPairs 主要是根据窗口表达式, 生成下面几个执行需要的核心类的对象

对RDD调用mapPartitions, 需要处理Iterator[InternalRow]并返回一个Iterator[InternalRow]

window执行过程中额外设置了buffer进行汇总,每个窗口中数据的缓存结构,有大小和条数限制,超出会移出到磁盘

fetchNextPartition做的事, 就是从子RDD的分区的Iterator[InternalRow]中, 每次读取同组的所有行(partition by列值相同的所有行). 它的执行逻辑, 依赖于RDD中的数据已经按照要求分区排序好了, 所以代码不复杂.

并经过一系列处理后join得到的window function result返回

另外可以看到上诉两个代码其实都是在调用frame(WindowFunctionFrame)的两个方法:

  • prepare(rows: ExternalAppendOnlyUnsafeRowArray): Prepare the frame for calculating the results for a partition. 在WindowExec的fetchNextPartition中被调用, 接收到同组的所有输入行.
  • write(index: Int, current: InternalRow): Write the current results to the target row. 向target中写入当前行的计算结果. 一次一行.

而且多个窗口时explain可以看到多个窗口串行执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue.js设计与实现】阅读笔记(持续更新)

从高层设计的角度去探讨框架需要关注的问题。 参考:速读《Vue.js 设计与实现》 - 掘金 (juejin.cn) 文章目录 第一章 权衡的艺术命令式和声明式性能与可维护性的权衡运行时和编译时 第二章:框架设计的核心要素__DEV__:在开发环境中为用户提供…

【AD9361 LVDS 时序图 补充】

ADI 官方图 ​2T2R LVDS 整理补充完整 特别注意调整frame

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用

背景 开发中我们基本使用windows系统比较快捷,但是部署的时候我们又希望使用linux比较便宜,硬件产商还仅提供了c sdk!苦了我们做二次开发的码农。 方案 需要确认一件事,目前c这门语言不是跨平台的 第一个问题【C生成dll在window…

Unity3d Cinemachine篇(三)— FreeLook

文章目录 前言一、使用FreeLook制造第三人称跟随效果1. 创建一个游戏物体2. 创建FreeLook相机4. 完成 前言 上一期我们简单的使用了Dolly CamerawithTrack相机,这次我们来使用一下FreeLook 一、使用FreeLook制造第三人称跟随效果 1. 创建一个游戏物体 游戏物体比较…

美国将限制中国,使用Azure、AWS等云,训练AI大模型

1月29日,美国商务部在Federal Register(联邦公报)正式公布了,《采取额外措施应对与重大恶意网络行为相关的国家紧急状态》提案。 该提案明确要求美国IaaS(云服务)厂商在提供云服务时,要验证外国…

【Linux】fork()函数

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

详细讲解Java中的Properties类

目录 前言1. 基本知识2. 代码示例3. Demo 前言 使用Properties出现中文乱码可看我这篇文章&#xff1a;properties出现中文乱码解决方法&#xff08;万能&#xff09; 1. 基本知识 Properties 类是 Java 中用于处理配置文件的工具类&#xff0c;它继承自 Hashtable 类&#…

防火墙到防火墙的高可用知识汇总

目录​​​​​​​ 防火墙 防火墙的分类&#xff1a; 防火墙的发展史 传统防火墙&#xff08;包过滤防火墙&#xff09;—— 一个严格的规则表 传统防火墙&#xff08;应用代理防火墙&#xff09;—— 每个应用添加代理 传统防火墙&#xff08;状态检测防火墙&#xff09…

去中心化世界的奇迹:深度解析Web3

随着科技的飞速发展&#xff0c;我们正逐渐进入一个新的数字时代&#xff0c;而Web3技术正是这个时代的奇迹之一。本文将深入解析Web3&#xff0c;揭示它在构建去中心化世界方面的深远影响以及给我们带来的可能性。 什么是Web3&#xff1f; Web3是互联网的第三个时代&#xff…

借助gpt生成ppt:文心一言(chatgpt)、chatppt

提供一种简单的基于gpt快速生成ppt的方式。前置条件&#xff1a; 文心一言chatpptwps/office ppt Step1: 下载chatppt插件 https://chat-ppt.com/invitelinke?share_code47949695&channelchat-ppt.com 注册地址 下载完成后&#xff0c;安装即可&#xff0c;安装完成后…

k8s 进阶实战笔记 | 应用的蓝绿、金丝雀发布笔记

文章目录 应用的蓝绿、金丝雀发布笔记应用升级策略停机升级滚动更新蓝绿发布金丝雀发布 应用的蓝绿、金丝雀发布笔记 应用升级策略 Deployment.spec.strategy 设置 Recreate&#xff1a;同时删除所有副本&#xff0c;停机升级策略 不存在新老版本共存 存在某个时间段服务不可…

Armv8-M的TrustZone技术之测试目标指令

为了允许软件确定内存位置的安全属性,使用了TT指令(Test Target)。 Test Target(TT)查询内存位置的安全状态和访问权限。 Test Target Unprivileged(TTT)查询内存位置的安全状态和访问权限,以进行对该位置的非特权访问。 Test Target Alternate Domain(TTA)和Test…

血细胞分类项目

血细胞分类项目 数据集&#xff1a;血细胞分类数据集数据处理 dataset.py网络 net.py训练 train.py拿训练集的几张图进行预测 数据集&#xff1a;血细胞分类数据集 https://aistudio.baidu.com/datasetdetail/10278 数据处理 dataset.py from torchvision import transfor…

Mysql使用命令行备份数据

目录 前言1. 基本知识2. 常用参数3. 拓展 前言 由于长期使用测试环境的数据库&#xff0c;时不时会有脏数据删除不干净&#xff0c;对此很需要一个实时将生产库的数据定期备份一份&#xff0c;防止生产库中会有脏数据进来。 1. 基本知识 mysqldump 是MySQL数据库管理系统提供…

HTML+CSS:3D卡片组件

效果演示 实现了一个名为“卡片”的效果&#xff0c;当鼠标悬停在一个特定的元素上时&#xff0c;该元素会变得更亮&#xff0c;并且会在其他元素上方显示一个卡片。当鼠标悬停在卡片上时&#xff0c;卡片会变得更亮&#xff0c;并且会在其他元素上方显示一个提示信息。这个效果…

开源:基于Vue3.3 + TS + Vant4 + Vite5 + Pinia + ViewPort适配..搭建的H5移动端开发模板

vue3.3-Mobile-template 基于Vue3.3 TS Vant4 Vite5 Pinia ViewPort适配 Sass Axios封装 vconsole调试工具&#xff0c;搭建的H5移动端开发模板&#xff0c;开箱即用的。 环境要求&#xff1a; Node:16.20.1 pnpm:8.14.0 必须装上安装pnpm&#xff0c;没装的看这篇…

力扣(leetcode)第118题杨辉三角(Python)

118.杨辉三角 题目链接&#xff1a;118.杨辉三角 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] …

c++入门语法—————引用,内联函数,auto关键字,基于范围的for循环,nullptr

文章目录 一.引用1.引例2.注意事项3.应用场景1.做参数&#xff08;a:输出型参数b:内容较大参数&#xff09;2.做返回值&#xff08;a:修改返回值&#xff0c;b:减少拷贝&#xff09; 4.引用和指针的区别 二.内联函数1.为什么有内联函数2.用法和底层3.特性 三.auto关键字1.基础示…

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案&#xff0c;开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞&#xff0c;该漏洞源于文件server/application/api/contr…

数据库之一 基础概念、安装mysql、sql语句基础

数据库之 基础概念、安装mysql、sql语句基础 【一】存储数据的演变过程&#xff1a; 文件存储&#xff1a; 初始阶段随意存放数据到文件&#xff0c;格式任意。目录规范引入&#xff1a; 软件开发使用目录规范&#xff0c;限制数据位置&#xff0c;建立专门文件夹。本地数据存…