是否可以在Luigi管道中的两个不同位置重用任务?

时间:2017-11-14 20:03:01

标签: python luigi

我正在开发Luigi管道并遇到了一个重大问题。似乎没有任何方法可以在同一个管道中重用任务。 为了说明我的目标,请考虑以下工作流程:

Collect_Data → Clean_data → Task_on_data_A → Task_on_data_B ↳ Sample_data → Task_on_data_A → Task_on_data_B

我在Clean_dataSample_data执行相同的操作。我想在Luigi做同样的事情,同时遵循DRY原则。现在看起来我必须真正复制并粘贴我的代码来完成任务A和B。

Airflow有a way to deal with situations like this. Luigi吗?

1 个答案:

答案 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()