Luigi LocalTarget 二进制文件

Posted

技术标签:

【中文标题】Luigi LocalTarget 二进制文件【英文标题】:Luigi LocalTarget binary file 【发布时间】:2017-01-03 21:52:07 【问题描述】:

我在项目的 Luigi 管道中编写二进制 LocalTarget 时遇到了麻烦。我在这里隔离了问题:

class LuigiTest(luigi.Task):
    def output(self):
        return luigi.LocalTarget('test.npz')

    def run(self):
        with self.output().open('wb') as fout:
            np.savez_compressed(fout, array=np.asarray([1, 2, 3]))

我尝试以'w''wb' 的身份打开,但我不断收到以下错误:

TypeError: write() argument must be str, not bytes

我使用的是 python 3.5.1,我的 luigi 版本是 2.1.1

【问题讨论】:

【参考方案1】:

问题在于LocalTarget 的格式。将其更改为:

return luigi.LocalTarget('test.npz', format=luigi.format.Nop)

解决了这个问题。但是,文档中对此一无所知。

【讨论】:

同样的问题,非常有用!【参考方案2】:

它解决了我在 Hadoop 中编写 parquet 文件的问题。 format=luigi.format.Nop 成功了。谢谢!

import luigi
import pandas as pd
import luigi.contrib.hdfs as hdfs

class Hdfs(luigi.Task):
    """
    Writes files into output.
    """
    def __init__(self, *args, **kwargs):
        super(Hdfs, self).__init__( *args, **kwargs)

    def output(self):
        fname_template = f'/data/some_directory/test_luigi.parq'
        return luigi.contrib.hdfs.HdfsTarget(fname_template, format=luigi.format.Nop)

    def run(self):
        with self.output().open('w') as f:
            print(f.path)
            d = pd.DataFrame('sim_id':[1,2,3])
            d.to_parquet(f)

【讨论】:

以上是关于Luigi LocalTarget 二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Luigi 管道时组织文件?

如何从 Python Luigi 登录

使动态 Luigi 任务的失败变得非关键

如何使 Luigi 任务生成内存列表作为目标

Python Luigi - 满意时继续执行外部任务

如何在 Python Luigi 中使用参数