【玩转daft】udf的几种使用方式

发布时间:2026/11/11 16:59:53

【玩转daft】udf的几种使用方式 daft.udf 已经0.7.0正式标记 deprecated。daft提供非常灵活的函数定义形式。1对1 row-rise1 row in - 1 value out 很多算子的组织形式importdaftdaft.funcdefadd(a:int,b:int)-int:returnab dfdaft.from_pydict({x:[1,2],y:[10,20]})dfdf.with_column(z,add(df[x],df[y]))1对多1 row in - N rows out可以这么写fromtypingimportIteratordaft.funcdefsplit_into_sentences(text:str)-Iterator[str]:importre sentencesre.split(r(?[.!?])\s,text.strip())forsentenceinsentences:ifsentence:yieldsentence输入输出这里Daft 会自动把原来的 ticket_id 复制到每个生成出来的新行不需要手动 explode()。这里的关键是 Iterator[T] 和 yield。返回类型是 Iterator[str]。这告诉 Daft这个函数不是返回一个普通字符串而是会连续 yield 多个字符串。比如yieldchunk 1yieldchunk 2yieldchunk 3Daft 就知道每个 yield 出来的值都应该变成一行。传统的做法 list explode()daft.funcdefsplit_into_sentences(text:str)-list[str]:return[A.,B.,C.]dfdf.with_column(sentences,split_into_sentences(df[body]))dfdf.explode(sentences)不用先把所有结果收集成一个大 list再 explode。对于长文档、音频切片、日志拆分、视频帧采样这种场景Generator 更自然也更省内存。访问外部接口 使用异步方式访问外部的时候使用异步的方式。适合 I/O比如 HTTP API、对象存储、小文件下载、远程 embedding 服务。daft.func(max_concurrency10)asyncdeffetch_url(url:str)-str:importaiohttpasyncwithaiohttp.ClientSession()assession:asyncwithsession.get(url)asresponse:returnawaitresponse.text()dfdf.with_column(html,fetch_url(df[url]))max_concurrency10 表示限制并发请求数避免打爆 API。避免内存/网络压力过大。异步函数asyncdeffetch(url):...调用后不是马上把结果算出来而是返回一个 coroutine需要被事件循环调度执行。在 Daft 里async def 的意义是这个 UDF 可以并发执行多行而不是一行一行阻塞等待。比如 100 个 URL 请求普通同步函数请求 1 完成再请求 2再请求 3async 函数可以同时发多个请求谁先返回就先处理谁。有状态的访问有昂贵初始化时用 daft.cls。比如加载模型、初始化 tokenizer、创建数据库连接。daft.clsclassTextClassifier:def__init__(self,model_path:str):self.modelload_model(model_path)def__call__(self,text:str)-str:returnself.model.predict(text)classifierTextClassifier(model.pkl)dfdf.with_column(label,classifier(df[text]),)不会立刻真的加载模型。Daft 执行任务时会在 worker 上初始化实例并复用它处理多行。daft.cls 里可以有多个方法daft.clsclassTextProcessor:def__init__(self,prefix:str):self.prefixprefixdef__call__(self,text:str)-str:returnself.prefixtextdeflowercase(self,text:str)-str:returntext.lower()deflength(self,text:str)-int:returnlen(text)processorTextProcessor( )dfdf.select(processor(df[text]).alias(prefixed),processor.lowercase(df[text]).alias(lower),processor.length(df[text]).alias(length),)call可以直接processor(df[text])普通方法要processor.lowercase(df[text])在 daft.cls 里如果某个方法需要指定返回类型用 daft.method。fromdaftimportDataTypedaft.clsclassTextProcessor:daft.method(return_dtypeDataType.list(DataType.string()))defsplit_words(self,text:str):returntext.split()或者返回 structdaft.clsclassAnalyzer:daft.method(return_dtypedaft.DataType.struct({word_count:daft.DataType.int64(),char_count:daft.DataType.int64(),}),unnestTrue,)defanalyze(self,text:str):return{word_count:len(text.split()),char_count:len(text),}调用dfdf.select(Analyzer().analyze(df[text]))如果 unnestTruestruct 会展开成多列word_count /char_count批处理daft.func.batch它和普通 daft.func 的区别是普通 UDF一行一行处理Batch UDF一批一批处理daft.func.batch(return_dtypedaft.DataType.int64())defword_count_batch(texts:daft.Series)-list:Count words in each text -- operating on the entire batch at once.return[len(text.split())fortextintexts.to_pylist()]这里函数收到的不是一个 str而是一批文本texts: daft.Series可以理解成[hello world,this is a ticket,daft udf batch example]然后函数返回同样长度的结果[2,4,4]也就是Series[str] - list[int]主要是为了减少 Python 调用开销并且方便用向量化库。普通 UDF每一行调用一次 Python 函数。比如 100 万行可能要调用 100 万次。Batch UDF 每一批调用一次 Python 函数 。比如每批 1024 行100 万行大约调用 1000 次。调用次数少很多。适合 NumPydaft.func.batch(return_dtypedaft.DataType.float64())defnormalize(values:daft.Series)-list:importnumpyasnp arrnp.array(values.to_pylist())arr(arr-arr.mean())/arr.std()returnarr.tolist()适合 pandasdaft.func.batch(return_dtypedaft.DataType.string())defclean_texts(texts:daft.Series)-list:importpandasaspd spd.Series(texts.to_pylist())ss.str.lower().str.strip()returns.tolist()适合批量 API比如 embedding API 通常支持一次传多个文本daft.func.batch(return_dtypedaft.DataType.embedding(daft.DataType.float32(),1536))defembed_texts(texts:daft.Series)-list:client...responseclient.embeddings.create(inputtexts.to_pylist(),modeltext-embedding-3-small,)return[item.embeddingforiteminresponse.data]这比每行单独请求一次 API 高效很多。参考https://docs.daft.ai/en/stable/examples/udf-patterns/#pattern-2-generator-one-input-becomes-many-rows
延伸阅读

更多相关文章

2026/11/12 2:09:32

PHP原生CC防护系统:请求指纹+动态限流+验证码闭环

简介:这是一套面向PHP开发者与Web安全初学者的轻量级CC攻击防护实践源码,聚焦于解决PHP网站在高并发场景下易遭模拟请求式DDoS(即CC攻击)导致服务瘫痪的问题。资源共14个文件,含7个核心PHP脚本(如anti_ddos…

2026/11/12 4:48:33

C51单片机实时频谱分析:滑动DFT定点实现与Keil工程落地

简介:本资源是面向嵌入式开发工程师与数字信号处理学习者的C51平台滑动DFT(Sliding DFT)完整实现方案,聚焦实时频谱分析场景下的轻量级算法落地。针对C51单片机内存与算力受限的特点,资源提供可直接移植的优化代码、原…

2026/11/12 10:29:56

自贡哪里可以考电工证 高含金量证书怎么选才不吃亏

自贡哪里可以考电工证 高含金量证书怎么选才不吃亏 工地太忙根本没时间复习考试,这几乎是每个一线工人的真实写照。尤其是像电工证这类必须通过考试才能上岗的特种作业证,不少工友都因为时间紧张、备考难度大而耽误了取证进度。但你知道吗?一张 含金量…

2026/11/12 10:29:56

邢台办理建筑电工证外地证怎么转过来?2026河南最新政策解读

邢台办理建筑电工证外地证怎么转过来?2026河南最新政策解读 之前考的证在外省能不能转过来?这是很多在邢台工作、但证书在别省的建筑电工最关心的问题。2026年河南最新政策明确,外地证可以通过“跨省通办”方式转到本地,但需要符合一定的条件,比…

2026/11/12 10:29:56

船员电工证怎么查多少钱 一份证可能决定你找工作的机会

船员电工证怎么查多少钱 一份证可能决定你找工作的机会 你是不是正愁找不到合适的工作?别急,船员电工证可能是你眼下最需要的那张通行证。现在越来越多的岗位要求持证上岗,特别是涉及电工作业的岗位, 船员电工证怎么查 、 多少钱…

2026/11/12 10:29:56

自贡哪里可以考电工证 上岗必备的电工证怎么考

自贡哪里可以考电工证 上岗必备的电工证怎么考 你有没有遇到这种情况?刚毕业就着急找工作,却发现没有电工证根本进不了门,连面试机会都没有?电工证是特种作业行业 上岗必备…

2026/11/12 10:29:56

邢台办理建筑电工证怎么避开坑?官方报名入口别乱选

邢台办理建筑电工证怎么避开坑?官方报名入口别乱选 怕考不过白交培训费?别慌,今天咱们就聊聊 邢台办理建筑电工证 的那些事,帮你理清报名流程、避坑技巧和考试重点。重点来了,别再乱选 官方报名入口 了,搞错了真要多花冤枉钱!…

2026/11/12 10:24:56

电工证口述怎么考 电工证怎么报名才能顺利上岗

电工证口述怎么考 电工证怎么报名才能顺利上岗 你现在急需一个电工证才能找到工作,对吧?别急,这篇文章会告诉你【电工证口述怎么考】,以及【怎么报名】的全过程,让你少走弯路,顺利拿到证书,早点上岗赚钱。…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

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

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

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