SparkSQL 之 UDF、UDAF 函数代码实现
摘要本文从 UDF/UDAF/UDTF 三大函数类型、两种注册方式、弱类型 vs 强类型 UDAF、Aggregator 生命周期、性能陷阱五个维度配合 2 张架构图 完整代码彻底掌握 SparkSQL 自定义函数实现。关键词UDF, UDAF, UDTF, Aggregator, functions.udf, spark.udf.register一、三大函数类型UDF 一对一: 1 行 → 1 行 (name → UPPER(name)) UDAF 多对一: N 行 → 1 行 (多行 → SUM/AVG) UDTF 一对多: 1 行 → N 行 (一行 → explode 多行)二、函数分类 注册UDF 两种注册方式importorg.apache.spark.sql.functions._// SQL 注册spark.udf.register(myUpper,(s:String)s.toUpperCase)spark.sql(SELECT myUpper(name) FROM users)// DSL 注册valmyUpperUdfudf((s:String)s.toUpperCase)df.withColumn(upper_name,myUpperUdf(col(name)))三、UDAF 深度对比 Aggregator 生命周期强类型 Aggregator推荐importorg.apache.spark.sql.expressions.AggregatorcaseclassAverage(varsum:Double,varcount:Long)objectAverageAggregatorextendsAggregator[Double,Average,Double]{defzero:AverageAverage(0.0,0L)// 初始缓冲defreduce(b:Average,a:Double):Average{b.suma;b.count1;b}// 分区内defmerge(b1:Average,b2:Average):Average{b1.sumb2.sum;b1.countb2.count;b1}// 跨分区deffinish(reduction:Average):Doublereduction.sum/reduction.count// 输出defbufferEncoder:Encoder[Average]Encoders.productdefoutputEncoder:Encoder[Double]Encoders.scalaDouble}valavgUDAFAverageAggregator.toColumn.name(avg_score)ds.select(avgUDAF).show()弱类型 UserDefinedAggregateFunctionclassMyAvgUDAFextendsUserDefinedAggregateFunction{definputSchemaStructType(StructField(input,DoubleType)::Nil)defbufferSchemaStructType(StructField(sum,DoubleType)::StructField(count,LongType)::Nil)defdataTypeDoubleTypedefdeterministictruedefinitialize(buffer:MutableAggregationBuffer){buffer(0)0.0;buffer(1)0L}defupdate(buffer:MutableAggregationBuffer,input:Row){/* 累加 */}defmerge(b1:MutableAggregationBuffer,b2:Row){/* 合并 */}defevaluate(buffer:Row)buffer.getDouble(0)/buffer.getLong(1)}spark.udf.register(myAvg,newMyAvgUDAF)四、性能陷阱与最佳实践⚠️ UDF 是黑盒 → Catalyst 无法优化 · 无法谓词下推 · 无法 WholeStageCodegen · 逐行序列化调用 ✅ 优化建议: 1. 优先用 Spark SQL 内置函数 2. 复杂逻辑用 Scala 表达式组合 3. 必须用 UDF → Pandas UDF (Arrow 向量化, 快 100x) 4. UDAF 优先用强类型 Aggregator五、总结分类UDF 一对一 / UDAF 多对一 / UDTF 一对多注册SQL 用 registerDSL 用 functions.udfUDAF强类型 Aggregator 优于弱类型 UDAF作者大数据技术实践者博客blog.starzy.cnGitHubstarzy1990.github.io专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践

相关新闻

如何让PC游戏实现分屏多人:Universal Split Screen 上手与自定义

如何让PC游戏实现分屏多人:Universal Split Screen 上手与自定义

如何让PC游戏实现分屏多人:Universal Split Screen 上手与自定义 【免费下载链接】UniversalSplitScreen Split screen multiplayer for any game with multiple keyboards, mice and controllers. 项目地址: https://gitcode.com/gh_mirrors/un/UniversalSplitSc…

2026/8/22 16:30:38 阅读更多 →
AI视频生成本地部署实战:从Stable Video Diffusion到Seedance生态搭建

AI视频生成本地部署实战:从Stable Video Diffusion到Seedance生态搭建

如果你最近关注AI视频生成,大概率被“Seedance2.5”和“即梦AI5.0”这两个名字刷屏了。各种教程和宣传语里充斥着“吊打付费”、“一键生成”、“学完接单”这类极具诱惑力的词汇,让人感觉仿佛一夜之间,人人都能成为AI视频大师。但事实真的如…

2026/8/22 16:30:37 阅读更多 →
windows 驱动实例分析系列: wireguard-nt驱动分析-driver篇(一)

windows 驱动实例分析系列: wireguard-nt驱动分析-driver篇(一)

WireGuardNT 驱动代码解析 - 第一篇:设备管理与IOCTL接口 1. 概述 WireGuardNT 驱动(driver/ 目录)是 WireGuard 在 Windows NT 内核中的核心实现,负责处理 VPN 隧道的数据包加解密、路由、对等体管理以及网络接口操作。本系列文档…

2026/8/22 16:29:37 阅读更多 →

最新新闻

Talebook 移动端阅读指南:如何把手机变成随身书架

Talebook 移动端阅读指南:如何把手机变成随身书架

Talebook 移动端阅读指南:如何把手机变成随身书架 【免费下载链接】talebook 一个简单好用的个人书库 项目地址: https://gitcode.com/gh_mirrors/ta/talebook Talebook 移动端适配是这款基于 Calibre 的个人书库的核心卖点:手机上就能找书、读书…

2026/8/22 17:10:53 阅读更多 →
FEALPy 上手指南:用 Python 跑通有限元分析的完整流程

FEALPy 上手指南:用 Python 跑通有限元分析的完整流程

FEALPy 上手指南:用 Python 跑通有限元分析的完整流程 【免费下载链接】fealpy Finite Element Analysis Library in Python 项目地址: https://gitcode.com/gh_mirrors/fe/fealpy 做仿真不想被商业 CAE 软件锁住?想自己控制网格、离散、求解的每…

2026/8/22 17:10:53 阅读更多 →
Win10网速优化全攻略:从诊断到硬件排查的完整解决方案

Win10网速优化全攻略:从诊断到硬件排查的完整解决方案

1. 问题根源:为什么你的Win10网速会变慢?网速慢,这几乎是每个Win10用户都踩过的坑。你可能会发现,明明宽带套餐升级了,路由器也换了新的,但电脑上的下载速度就是上不去,看个高清视频都要缓冲半天…

2026/8/22 17:10:53 阅读更多 →
美赛中层次分析法(AHP)的本质与实战避坑指南

美赛中层次分析法(AHP)的本质与实战避坑指南

1. 为什么美赛里A题和C题总有人用层次分析法,而B题几乎没人碰它?2024年美赛刚结束那会儿,我翻了近三百份公开的A题(资源调度优化)、B题(无人机集群路径规划)和C题(城市韧性评估&…

2026/8/22 17:10:53 阅读更多 →
Wisp:融合Shell便捷与Lua编程能力的结构化管道Shell实战

Wisp:融合Shell便捷与Lua编程能力的结构化管道Shell实战

大家好,我是长期在CSDN分享技术实战经验的博主。在日常的运维和自动化开发中,你是否也遇到过这样的困扰:传统的Bash脚本在处理复杂逻辑时语法晦涩难懂,调试起来像“猜谜”;而用Python写脚本虽然强大,但启动…

2026/8/22 17:10:53 阅读更多 →
数学建模竞赛全流程实战指南:从选题到论文的决策与执行

数学建模竞赛全流程实战指南:从选题到论文的决策与执行

1. 赛题选择:从“看热闹”到“看门道”的决策逻辑每年高教社杯数学建模竞赛(以下简称“国赛”)题目公布的那一刻,对于绝大多数参赛队伍来说,第一个也是最关键的挑战,不是如何解题,而是如何选题。…

2026/8/22 17:09:53 阅读更多 →

日新闻

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

沉金PCB工艺实战指南:从设计到SMT焊接的可靠性保障

在电子硬件开发领域,PCB(印制电路板)的沉金工艺是提升产品可靠性和焊接质量的关键环节。对于需要高密度互连、长期稳定运行或高频信号传输的板卡,如“黍姐仿通行证”这类可能涉及身份识别、数据交互的硬件项目,选择正确…

2026/8/22 0:00:11 阅读更多 →
电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

电气考研电路八月强化四步法:从知识体系到真题实战的闭环攻略

这次我们来看一个针对电气考研电路科目的学习规划项目。它不是软件工具,而是一套聚焦于8月份关键节点的备考策略。对于电气工程考研的同学来说,电路分析是专业课的重中之重,也是拉开分差的关键。进入8月,复习进入强化阶段&#xf…

2026/8/22 0:00:11 阅读更多 →
消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

消除AI代码的“AI味”:Claude Code设计优化技能配置与实战指南

大家好,我是专注于前端开发与AI工具实践的技术博主。在日常使用 Claude Code 等AI编程助手时,你是否也遇到过这样的困扰:生成的代码功能上没问题,但代码风格、组件设计、交互逻辑总透着一股“AI味”——布局单调、样式简陋、交互生…

2026/8/22 0:00:11 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/22 8:09:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →