[英]How to inherate a Class of type Flow in prefect?
我目前在一個簡單的 python class 中定義了一個工作流。在這個 class 中,我為每個任務定義了一個單獨的方法。 我現在通過 class.run() 啟動 ETL。
class Main():
...
def _read_data(self, fname: str):
""" read data from file """
....
return data
def _process_data(self, data):
""" process data """
...
return results
def run(self, fname: str):
""" define ETL"""
data = self._read_data(fname)
results = self._proess_data(data)
我現在有不同的數據應該由 ETL 處理。 所以我從 Main class 繼承了一個新的 class 並覆蓋了 read_data 方法。 這樣我就有了一個干凈的代碼結構,並且想將方法轉移到 Prefect。
class B(Main):
def _read_data(self, fname:str):
""" read csv file, seperator not , but \t """
return data
我可以為單個任務定義任務類型的類。 我還可以定義一個流 class 來替換不同數據的 read_data 方法嗎? 有沒有人有一個可以理解的例子給我?
我將一定數量的參數傳遞給流程並根據這些參數啟動動態流程是否更有意義? 這樣我就可以通過參數控制讀取數據的方式,ETL的rest是固定的。
謝謝,馬庫斯
如果您重寫您的 Prefect 1.0 流程結構以適應功能性 API 會更好。鑒於 Prefect 2.0(即 Prefect 的未來版本)將不再支持命令式基於類的 API ,現在重寫您的流程將使您的自定義代碼與未來的 Prefect 版本兼容。
除了使您的代碼與 Prefect 的未來版本兼容之外,您還將通過這種方式獲得更多的可觀察性。 為什么? 目前,Main 和 B 類都只為您提供有關“大”ETL 作業的信息——如果失敗,它只會為您提供 ETL 失敗的信息,而不會告訴您是哪一部分導致了問題(提取時是否出了問題) ,轉換或加載數據)。 此文檔頁面提供了更多相關背景信息,包括如何在 Prefect 流程中應用它的示例。
但是由於您的問題明確詢問了命令式 API,因此從Task
繼承的每個 class 都有一個您可以覆蓋的.run()
方法,當您在流程中調用任務時將調用此方法。
根據您描述的問題,函數式編程似乎是解決它的正確方法,因為在每個流程中您都可以調用不同的功能性任務來指定如何讀取數據而不是在任務或流程 class 上覆蓋它。您提到過您會喜歡對其進行參數化以確定根據一些動態提供的參數值運行哪個任務。 這可以使用case
任務:
from random import random
from prefect import task, Flow, case
@task
def check_condition():
return random() < .5
@task
def action_if_true():
return "I am true!"
@task
def action_if_false():
return "I am false!"
@task
def another_action(val):
print(val)
with Flow("conditional-branches") as flow:
cond = check_condition()
with case(cond, True):
val = action_if_true()
another_action(val)
with case(cond, False):
val = action_if_false()
another_action(val)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.