[英]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.