SmartETL函数式组件的设计与应用

SmartETL框架主要采用了面向对象的设计思想,将ETL过程中的处理逻辑抽象为LoaderProcessor(对应loader模块和iterator模块),所有流程组件需要继承或实现DataProvider(iter方法)或JsonIteratoron_data__process__方法)。

例如以下代码实现将论文结构中的摘要和正文拼接为一个字符串字段,方便后续对论文建立全文索引。

class ConcatPaperContent(JsonIterator):"""arxiv html页面数据处理类"""def on_data(self, data: Any, *args):paper = data['paper']content = ""if paper:abstract = paper.get('abstract')content += f"{abstract}\n"sections = paper.get('sections')for section in sections:content += f"{section['content']}\n"data['content'] = contentreturn data

然而,业务中很多处理逻辑比较简单,以往开发时用少数几行代码就可以搞定,而在SmartETL框架中,则必须实现一个类,正如上面的例子所示。虽然SmartETL支持加载外部包的组件(只要在sys.path中),但如果是需要定制开发则相对繁琐。

此前,在过滤组件(Filter)中考虑到这种情况,解决办法是在流程中定义Lambda表达式。例如以下流程定义中,filter节点通过Lambda表达式abnormal_time实现过滤publish_time字段值小于当前时间的记录的功能,即,对于经过filter节点的记录,仅当其publish_time字段值大于等于当前时间current时才会输出给后续节点。

nodes:current: util.dates.current_ts(True)abnormal_time: "=lambda t, current=current: t >= current "filter: Filter(abnormal_time, key='publish_time')

为了简化业务代码编写,SmartETL新增实现函数式组件,即以函数形式提供核心处理逻辑,而不需要封装成类。Lambda表达式就是一种特殊的函数。

跟C/C++、Java不同,Python语言中函数是一等公民,即开发者可以直接访问和操作函数,支持将函数作为一个对象进行加载、传递和管理,这对于开发一些高级功能,提高程序扩展性非常方便。

SmartETL函数式组件是指将任意编写的数据处理函数作为ETL流程组件,加入到流程处理中。唯一的限制是:除了作为Loader组件的函数外(框架无法提供输入),函数应该以流程数据作为输入参数,并将需要向后续流程传递的数据作为输出参数。以下表格说明了函数的参数与节点类型作用的对应关系:

节点类型是否支持输入是否要求有输出
Loader节点否(可通过配置提供)
Processor节点是(流程数据作为第一个参数)均可

为了使用函数对象,框架设计了函数式Loader组件Function如下:

class Function(DataProvider):"""函数调用包装器 提供调用函数的结果"""def __init__(self, function, *args, **kwargs):""":param function 函数对象或函数对象的完整限定名(如wikidata_filter.util.files.get_lines)"""assert function is not None, "function is None!"if isinstance(function, str):from wikidata_filter.util.mod_util import load_clsfunction = load_cls(function)[0]self.function = functionself.args = argsself.kwargs = kwargsdef iter(self):"""DataProvider的主要API,对提供函数进行调用"""# 注意,使用了组件构造参数res = self.function(*self.args, **self.kwargs)if isinstance(res, GeneratorType):for item in res:yield itemelse:yield res

类似的,框架实现了Function(JsonIterator)。常用的Map组件也支持提供函数对象或函数对象完整限定名。

基于函数式组件对本文开头的示例进行改写,代码如下:

def concat_paper_content(paper: dict):paper = paper or {}abstract = paper.get('abstract')content = f"{abstract}\n"sections = paper.get('sections')for section in sections:content += f"{section['content']}\n"return content

在yaml流程中进行引用,如下所示:

nodes:concat: Map('gestata.arxiv.concat_paper_content')

或者:

nodes:concat: Function('wikidata_filter.gestata.arxiv.concat_paper_content')

流程说明:通过yaml流程文件,将concat_content函数与Map进行绑定(假设该函数定义在wikidata_filter.gestata.arxiv模块中),实现对基于paper的处理,并将函数调用返回值作为content字段值。

注意,为了支持Function使用自定义组件(可能在任意sys.path可访问模块),需要提供完整的函数对象限定名,本示例中包括顶层模块wikidata_filter

那么,MapFunction有什么区别呢?主要区别是Map主要是为了支持wikidata_filter.gestatawikidata_filter.util模块中定义的函数,且支持指定要处理的字段(通过key参数)和目标字段(通过target_key参数)。

从示例中可以看出,使用函数式组件至少有几点好处:

  • 代码更简洁:只需要实现一个提供核心处理逻辑的函数即可。
  • 配置更加灵活:通过流程指定输入字段和输出字段,可以灵活适配不同业务数据。
  • 复用性更好:可以通过代码或yaml配置进行复用。

在此前arXiv论文数据处理应用流程中,大量采用了函数式组件。具体可查看https://github.com/ictchenbo/SmartETL/blob/main/wikidata_filter/gestata/arxiv.py了解详情。

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

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

相关文章

鸿蒙AI开发:10-多模态大模型与原子化服务的集成

鸿蒙AI开发:10-多模态大模型与原子化服务的集成 在鸿蒙生态中,多模态大模型与原子化服务的集成是一个重要课题。本文将介绍如何在鸿蒙平台上进行多模态大模型与原子化服务的集成,以及相关的技术细节和实际案例。 鸿蒙AI开发概述 什么是鸿蒙AI…

python打卡day29@浙大疏锦行

知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…

20250516使用TF卡将NanoPi NEO core开发板出厂的Ubuntu core22.04.3系统降级到Ubuntu core16.04.2

20250516使用TF卡将NanoPi NEO core开发板出厂的Ubuntu core22.04.3系统降级到Ubuntu core16.04.2 2025/5/16 10:58 缘起:NanoPi NEO core核心板出厂预制的OS操作系统为Ubuntu core22.04.3系统。 【虽然是友善之臂提供的最新的系统,但是缺少很多用用程序…

密西根大学新作——LightEMMA:自动驾驶中轻量级端到端多模态模型

导读 目前将自动驾驶与视觉语言模型(VLMs)结合的研究越来越火热,VLMs已经证明了其对自动驾驶的重要作用。本文引入了一种用于自动驾驶的轻量级端到端多模态模型LightEMMA,它能够集成和评估当前的商业和开源模型,以研究…

框架之下再看HTTP请求对接后端method

在当今的软件开发领域,各类框架涌现,极大地提升了开发效率。以 Java 开发为例,Spring 框架不断演进,Spring Boot 更是简化到只需引入 Maven 包,添加诸如SpringBootApplication、RestController等注解,就能轻…

Vue+Go 自定义打字素材的打字网站

Typing_Key_Board 这是一个基于Vue 3和Go语言的自定义素材打字练习网站,灵感来源于常用字打字练习,解决了大多数网站无法自定义打字素材的问题。在 Typing_Key_Board (简称TKB)中,用户可以自定义打字素材进行练习,在复习代码的同…

开源物联网平台(OpenRemote)

在物联网技术蓬勃发展的当下,OpenRemote作为一款强大的开源物联网平台,正逐渐在多个领域崭露头角。尤其是在智能能源管理领域,它为微电网和分布式能源网络提供了全面且灵活的数据集成与管理方案,展现出独特的优势。 OpenRemote提供…

Spring Security与SaToken的对比与优缺点分析

Spring Security与SaToken对比分析 一、框架定位 Spring Security 企业级安全解决方案,深度集成Spring生态提供完整的安全控制链(认证、授权、会话管理、攻击防护)适合中大型分布式系统 SaToken 轻量级权限认证框架,专注Token会…

每日一道leetcode(新学数据结构版)

208. 实现 Trie (前缀树) - 力扣(LeetCode) 题目 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动…

【自然语言处理与大模型】大模型(LLM)基础知识④

(1)微调主要用来干什么? 微调目前最主要用在定制模型的自我认知和改变模型对话风格。模型能力的适配与强化只是辅助。 定制模型的自我认知:通过微调可以调整模型对自我身份、角色功能的重新认知,使其回答更加符合自定义…

基于 Spring Boot 瑞吉外卖系统开发(十五)

基于 Spring Boot 瑞吉外卖系统开发(十五) 前台用户登录 在登录页面输入验证码,单击“登录”按钮,页面会携带输入的手机号和验证码向“/user/login”发起请求。 定义UserMapper接口 Mapper public interface UserMapper exte…

什么是TCP协议?它存在哪些安全挑战?

一、TCP协议概述 TCP(传输控制协议)是互联网中面向连接、可靠的传输层协议,主要负责在不可靠的IP层上实现数据的可靠传输。其核心特点包括: 面向连接:通信前需通过三次握手(SYN-SYN/ACK-ACK)建…

12条热门照片提示

12条热门照片提示 1. 赛博朋克光彩 (Cyberpunk Glow-Up) 未在文件中显示2. 卡通化我 (Cartoonify Me) Convert this image of [your subject here] into a 3D Pixar-style cartoon clean lines, soft lighting, expressive features, and a polished render that feels cine…

Java求职面试揭秘:从Spring到微服务的技术挑战

文章简述 在这篇文章中,我们将通过一个幽默的面试场景,揭秘互联网大厂Java求职者在面试中面对的技术挑战。面试官将从Spring框架、微服务架构到大数据处理等多个维度进行提问,并详细讲解这些技术点的应用场景和解决方案,帮助小白…

用Python输出一个文件夹的所有文件结构

输出一个文件夹的所有目录和文件结构 新建一个Python文件,输入 这个文件表示查询一个文件夹所有的目录结构 import osdef print_directory_structure(root_dir):"""打印树状目录结构(优化版)"""if not os.p…

R语言的专业网站top5推荐

李升伟 以下是学习R语言的五个顶级专业网站推荐,涵盖教程、社区、资源库和最新动态: 1.R项目官网 (r-project.org) R语言的官方网站,提供软件下载、文档、手册和常见问题解答。特别适合初学者和高级用户,是获取R语言核心资源的…

IntelliJ IDEA给Controller、Service、Mapper不同文件设置不同的文件头注释模板、Velocity模板引擎

通过在 IntelliJ IDEA 中的 “Includes” 部分添加多个文件头模板,并在 “Files” 模板中利用这些包含来实现不同类型文件的注释。以下是为 Controller、Service、Mapper 文件设置不同文件头的完整示例: 1. 设置 Includes 文件头模板 File > Settin…

LabVIEW双音信号互调失真测量

该VI构建实现了一套完整的双音信号互调失真(IMD)测量系统。该系统通过精确控制信号生成、采集与分析流程,实现对被测设备(DUT)非线性特性的量化评估,可广泛应用于通信设备、音频系统、射频器件等领域的研发…

56.合并区间(java)

题目描述: 1.先判断给定intervals是否为空或者大小是否为1,是则直接返回intervals。 2.对intervals进行排序 数组形式则使用:Arrays.sort(intevals,(a,b)->Integer.compare(a[0],b[0])); ArrayList形式:intervals.sort((a,b)-…

Redis设计与实现——Redis命令参考与高级特性

Redis命令参考 数据类型相关命令 SET:设置键值,支持过期时间、不存在/存在条件。GET:获取键值,若键不存在返回 nil。INCR/DECR:将键的整数值增1/减1,键不存在时初始化为0。MSET/MGET:批量设置…