如何使用Luigi持续更新目标文件?

时间:2017-03-22 19:15:08

标签: python luigi

我最近开始使用Luigi,我想了解如何使用它来不断将新数据附加到现有目标文件中。

想象一下,我每分钟都在ping一个api来检索新数据。因为Task仅在Target尚未出现时才会运行,所以一种天真的方法是通过当前datetime来参数化输出文件。这是一个简单的例子:

import luigi
import datetime

class data_download(luigi.Task):
    date = luigi.DateParameter(default = datetime.datetime.now()) 

    def requires(self):
        return []

    def output(self):
        return luigi.LocalTarget("data_test_%s.json" % self.date.strftime("%Y-%m-%d_%H:%M"))

    def run(self):
        data = download_data()
        with self.output().open('w') as out_file:
            out_file.write(data + '\n')

if __name__ == '__main__':
    luigi.run()

如果我安排此任务每分钟运行一次,它将执行,因为当前时间的目标文件尚不存在。但它每分钟创建60个文件。我想要做的是确保所有新数据最终都在同一个文件中最终。实现这一目标的可扩展方法是什么?欢迎任何想法,建议!

2 个答案:

答案 0 :(得分:1)

您不能。正如LocalTarget的{​​{3}}所说:

  

参数:mode(str)–模式r以只读模式打开FileSystemTarget,而w将以写入模式打开FileSystemTarget。子类可以实现其他选项。

即仅允许使用rw模式。其他选项,例如a,需要扩展LocalTarget类;尽管它破坏了Luigi任务执行所需的幂等性。

答案 1 :(得分:0)

def output(self):
        return luigi.LocalTarget("data_test_%s.json" % self.date.strftime("%Y-%m-%d_%H:%M"))

这不是'luigi方式',但它确实起到了作用。最后,这些目标只是文件对象。