2017-02-28 35 views
8

我使用Spotify's Luigi在Python 3.6中编写我的第一个项目,以便在流水线中安排一些自然语言处理任务。在Luigi中的任务之间传递Python对象?

我注意到Task类的output()函数总是返回某种Target对象,它只是某处的某个文件,无论是本地的还是远程的。因为我的任务会生成更复杂的数据结构,比如解析树,所以将它们作为字符串写入文件并在之后再次读取它们是非常尴尬的。

因此,我想问一下在管道中的任务之间是否有可能传递Python对象?

回答

7

短的答案:号

路易参数被限制为日期/ datetime对象,字符串,整数和浮点型。请参阅docs for reference

这意味着,你需要你的序列化复杂的数据结构为一个字符串(使用JSON,msgpack,任何你喜欢的串行器,甚至压缩它),并把它作为一个字符串参数。

当然,你可以写一个自定义参数的子类,但你需要实现serialize and parse methods基本。

但是请注意:如果您使用参数而不是将计算的数据保存到目标,那么您将失去使用Luigi的一个关键优势:如果树中的父任务失败的次数超过了您指定的重试次数,那么你需要运行再次计算复杂数据结构的任务。如果您的任务计算复杂的数据或需要大量时间或消耗大量资源,那么您应该将输出保存为目标,以便不必再次执行所有昂贵的计算。

而且超越:另一个任务可能也需要这些数据,那么为什么不保存它呢?

而且,请注意,目标不仅是文件:您可以将数据保存到数据库表,Redis的,Hadoop的,弹性搜索索引,以及更多:http://luigi.readthedocs.io/en/stable/api/luigi.contrib.html#submodules

+0

非常感谢! A +答案。 – Kaleidophon