我正在开发Luigi管道并遇到了一个重大问题。似乎没有任何方法可以在同一个管道中重用任务。 为了说明我的目标,请考虑以下工作流程:
Collect_Data → Clean_data → Task_on_data_A → Task_on_data_B
↳ Sample_data → Task_on_data_A → Task_on_data_B
我在Clean_data
和Sample_data
执行相同的操作。我想在Luigi做同样的事情,同时遵循DRY原则。现在看起来我必须真正复制并粘贴我的代码来完成任务A和B。
Airflow有a way to deal with situations like this. Luigi吗?
答案 0 :(得分:2)
我认为你应该绘制箭头作为依赖箭头走向另一个方向。由于执行路径由requires方法决定,因此以这种方式考虑它会有所帮助。在您的场景中,它非常简单,因为您只有一个具有条件依赖关系的TaskA。
你只需要在开始时添加一个依赖于两个TaskB的任务,以及是否要在样本上运行taskb的指标
伪代码:
ParentTask
def requires():
return [TaskB(sample_type=True),
TaskB(sample_type=False)]
TaskB
def requires():
return TaskA(sample_type)
TaskA
def requires():
if sample_type:
return SampleTask()
else:
return CleanTask()
SampleTask
def requires():
return CleanTask()
CleanTask
def requires()
return CollectData()