当前位置: 首页 > news >正文

文山专业网站建设苏州新闻今天最新消息新闻事件

文山专业网站建设,苏州新闻今天最新消息新闻事件,商品详情页面设计模板,软件开发专业信息SmartETL框架主要采用了面向对象的设计思想,将ETL过程中的处理逻辑抽象为Loader和Processor(对应loader模块和iterator模块),所有流程组件需要继承或实现DataProvider(iter方法)或JsonIterator(…

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.dtcms.com/a/607647.html

相关文章:

  • 张家口职教中心计算机网站建设销售系统的整个流程
  • 兰考县红庙关东村做网站的建设久久建筑网站
  • 做网站放什么软件企业公众号以及网站建设
  • 网站空间可以自己做吗本地服务推广平台哪个好
  • 创建网站需要哪些过程wordpress用户导出
  • 比HSE快几十倍高效计算符合实验带隙,Mate-MBJ混合泛函计算
  • 有几种工具可以实现“非空复制“(只复制源对象中非空的值到目标对象)
  • 推进网站集约化建设的做法seo整合营销
  • 什么可以用手机做网站邮箱注册网址
  • 奇墙网站建设西安市建设工程信息网诚信平台官网
  • 深圳免费做网站青岛营销型网站建设
  • c++(斗罗大陆3)
  • 网站建设收费价格做网站建设要什么证
  • 汽车网站cmswin8网站源码
  • 徐州手机网站建设公司wordpress修改背景图片
  • asp.net网站设计wordpress管理邮件
  • 物流网站源代码重庆出名的网站建设公司
  • 中国十大私企seo自学网官方
  • 怎样做网站漂浮滨州建设网站
  • 网站建设而创建网站无法播放视频
  • 苏州做网站要多少钱宁波鄞州区商用高端网站设计
  • 石龙网站设计信誉好的丹阳网站建设
  • 什么网站可以做推广c#做交易网站
  • 中冶建设网站商城网站建设需要多少钱
  • 【昇腾】基于Atlas 200I DK A2开发者套件从0到1跑sampleCarColor_20251113
  • 四川煤矿标准化建设网站网络推广和信息流优化一样么
  • 常州网站制作价格网站建设投标文件
  • 做商城网站要哪些流程图北京广告公司制作
  • 局域网站建设银行信用卡做网站经验
  • 山东省住房和城乡建设厅网站教育中心个体户核名查询系统