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'] = content
        return 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_cls
            function = load_cls(function)[0]
        self.function = function
        self.args = args
        self.kwargs = kwargs

    def iter(self):
        """DataProvider的主要API,对提供函数进行调用"""
        # 注意,使用了组件构造参数
        res = self.function(*self.args, **self.kwargs)
        if isinstance(res, GeneratorType):
            for item in res:
                yield item
        else:
            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了解详情。

内容概要:本文将金属腐蚀现象比作游戏角色受到持续伤害(debuff),并采用浓度迁移和损伤方程来建模这一过程。文中首先介绍了浓度迁移的概念,将其比喻为游戏中使角色持续掉血的毒雾效果,并展示了如何利用Numpy矩阵存储浓度场以及通过卷积操作实现浓度扩散。接着引入了损伤方程,用于评估材料随时间累积的损伤程度,同时考虑到材料自身的抗性特性。作者还提供了完整的Python代码示例,演示了如何在一个二维网格环境中模拟24小时内金属表面发生的腐蚀变化,最终得到类似珊瑚状分形结构的腐蚀形态。此外,文章提到可以通过调整模型参数如腐蚀速率、材料抗性等,使得模拟更加贴近实际情况。 适合人群:对材料科学、物理化学感兴趣的科研工作者和技术爱好者,尤其是那些希望通过编程手段深入理解金属腐蚀机制的人群。 使用场景及目标:适用于希望借助数值模拟方法研究金属腐蚀行为的研究人员;可用于教学目的,帮助学生更好地掌握相关理论知识;也可作为工程项目前期评估工具,预测不同条件下金属构件可能遭受的腐蚀损害。 阅读建议:由于文中涉及较多数学公式和编程细节,建议读者具备一定的Python编程基础以及对线性代数有一定了解。对于想要进一步探索该领域的学者来说,可以尝试修改现有代码中的参数设置或者扩展模型维度,从而获得更丰富的研究成果。
基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(高分项目)基于机器学习的银行客户产品认购预测项目Python源码及全套资料(
小区物业管理系统是一款基于.NET平台开发的软件应用,用于全面管理住宅小区的日常运营。它通过多种功能提升物业管理效率、优化服务质量,并促进业主物业之间的沟通。在设计过程中,该系统采用了UML(统一建模语言)来确保其结构化和可维护性。UML是一种标准化的建模工具,通过图形化方式描述系统的结构行为,帮助开发者理解和实现复杂的软件项目。 本项目涵盖了UML的十大模型图,包括用例图、类图、对象图、序列图、协作图、状态图、活动图、组件图、部署图和包图。这些模型图从不同角度描绘系统,例如用例图展示参者(如业主、物业人员)系统功能的交互;类图定义系统中的类、接口及其关系;对象图是类图的实例;序列图和协作图描述对象间的动态交互;状态图和活动图关注行为变化;组件图和部署图关注物理结构;包图则用于组织模块结构。 压缩包中的“杨平.doc”可能是设计者或项目负责人杨平的工作文档,包含项目需求、设计思路等重要信息。“任务书.doc”应明确项目的具体任务要求,如功能需求和性能指标。“小区物业管理系统.mdl”是UML模型文件,记录了系统的详细设计。“小区物业”可能是其他相关文件,如源代码或数据库脚本。整个项目提供了从需求分析到系统实现的完整流程,对于学习.NET开发和理解UML建模技术具有重要参考价值。开发者通过研究这些模型图,能够更好地构建类似的物业管理系统,提升软件工程实践能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值