SparkSQL 之 UDF、UDAF 函数代码实现

发布时间:2026/10/21 10:37:20

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 · 大数据架构 · 数据工程实践
延伸阅读

更多相关文章

2026/10/21 13:22:10

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

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

2026/10/21 13:23:44

2026年Java面试核心考点与云原生趋势解析

1. 2026年Java面试趋势与核心考察点2026年的Java技术栈相比前几年有了显著变化,各大厂面试题也呈现出新的特点。从当前技术趋势来看,以下五个领域成为必考重点:1.1 JVM深度优化成为分水岭不再局限于简单的内存模型和GC算法问答,面…

2026/10/21 15:03:50

agent-skills:把智能体能力沉淀为可复用、可编排的技能库

agent-skills:把智能体能干的活,沉淀成一套可复用、可编排的技能库做Agent项目时间长了,你会发现一个挺扎心的规律:单看一个智能体的Demo,跑通并不难,难的是让它稳定地干很多不同类型的活。今天聊的这个项目…

2026/10/21 15:03:50

交通信号灯识别数据集:三种标注格式与82.88% mAP复现

前段时间整理了一个带标注信息的交通信号灯识别数据集,核心能力是识别左转灯、红绿黄灯,实测识别率82.88%,并且同步导出了YOLO、COCO JSON、Pascal VOC XML三种标注格式。这个数字不是拍脑袋报的,是我在自己环境里完整跑训练和验证…

2026/10/21 15:03:50

股票期权适当性考试考点拆解:先建立风险边界再谈开户

简介:面向拟参加上交所股票期权适当性考试的投资者、从业者与备考学员,尤其能让对期权规则不熟悉的读者快速入门;这套题库资料以单选题形式系统梳理期权交易核心考点,适合备考时间紧张、需要反复刷题校验的人群。内容涵盖期权买方…

2026/10/21 15:03:50

IntelliJ IDEA Git高效实战:图形化操作深度指南

1. 这不是Git教程,而是我在IntelliJ IDEA里“摸爬滚打”五年攒下的真功夫你点开这个标题,大概率不是想学Git基础命令——git clone、git commit、git push这些,官网文档写得比谁都清楚。你真正卡住的地方,是当一个分支在IDEA里突然…

2026/10/21 14:58:43

AI证件照制作API全流程:人脸检测、人像分割与背景替换实战

1. 项目背景:为什么证件照不能靠"随手拍 随便裁"解决先说个我自己的经历。前阵子有个朋友着急办证,手头只有一张在咖啡馆拍的侧身自拍,问我能不能帮忙"裁一下"当证件照用。我当时就跟他讲,证件照真不是把脑袋…

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介:这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目,核心实现智能驾驶模型(IDM)下的车辆跟驰与换道行为,可用于理解速度、密度与流量之间的动态关系,适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”,而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时,我反复遇到一种令人困惑的现象:智能体在用户指令发出后,几乎秒级响应“已收到”“正在处理”“请稍候”,UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑