使用Luigi使用不同的参数和动态依赖项运行相同的任务

时间:2018-10-25 15:18:24

标签: pipeline luigi

我认为这是普遍现象,我只是在努力找出适当的luigi依赖结构,但实际情况是这样的:

我有一个装满csv文件的文件夹。 TaskA用csv文件配对,然后将配对文件的路径写入.txt文件

TaskB应该采用一对路径,并使用2个csv文件做目标路径

TaskC应该获取TaskA的输出,并为TaskA输出中的每一对安排N个TaskB。

大致代码如下:

class TaskA(luigi.Task):
    data_dir = luigi.Parameter()

    def output(self):
        return luigi.LocalTarget('list_of_pairs.txt')

    def run(self):
        files = os.listdir(self.data_dir)
        pairs = MakePairs(files)
        with self.output().open('w') as fout:
            for x, y in pairs:
                 fout.write('{},{}\n'.format(x, y))

class TaskB(luigi.Task):
    file1 = luigi.Parameter()
    file2 = luigi.Parameter()

    def run(self):
        with open(self.file1, 'r') as f1, open(self.file2, 'r') as f2, self.output().open('w') as fout:
            newdata = DoSomething()
            fout.write(newdata)

    def output(self):
        return luigi.LocalTarget(os.path.join(target_dir, self.file1[:-3] + '.foo'))


class TaskC(luigi.Task):
    work_dir = luigi.Parameter()

    def requires(self):
        return TaskA(self.work_dir)

    def run(self):
        task_b_list = []
        with self.input().open('r') as fin:
            for line in fin:
                file1, file2 = line.split(',')
                task_b_list.append(TaskB(file1, file2))
        yield task_b_list
        DoStuff()

def output(self):
    return luigi.LocalTarget('output_c')

我这样做正确吗?还是有其他方法可以做到这一点?我这样做的原因是因为文件很大,所以允许多个工作人员完成任务B中的工作,这就是为什么taskC只是taskB的调度程序的原因

0 个答案:

没有答案