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.pswp.cn/news/906168.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906168.shtml
英文地址,請注明出處:http://en.pswp.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:批量設置…