我认为这是普遍现象,我只是在努力找出适当的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的调度程序的原因