在luigi中使用HDF5数据集(不要与HDFS混淆)作为目标

时间:2018-12-20 19:53:50

标签: python h5py hdf luigi

根据我对文档的阅读,luigi旨在将文本文件或原始二进制文件用作目标。我正在尝试为在常规文件系统上使用h5py的,使用HDF5文件(具有许多优点)的现有处理管道构建luigi工作流。此工作流程中的某些任务不会创建一个完整的新文件,而是将新的数据集添加到现有的HDF文件中。使用h5py,我将读取以下数据集:

hdf = h5py.File('filepath','r')
hdf['internal/path/to/dataset'][...]

使用以下内容编写数据集:

hdf['internal/path/to/dataset'] = np.array(data)

并测试HDF文件中的数据集是否存在以下行:

'internal/path/to/dataset' in hdf

我的问题是,有没有办法使luigi适应这些类型的文件? 我对luigi docs的阅读使我认为我可以继承luigi.format.Format或继承LocalTarget并创建自定义“ open”方法。但我找不到有关如何实现此功能的任何示例。非常感谢任何建议!

1 个答案:

答案 0 :(得分:1)

d6tflow具有HDF5熊猫实现,可以轻松扩展以保存除熊猫数据帧以外的数据。

import d6tflow
from d6tflow.tasks.h5 import TaskH5Pandas
import pandas as pd

class Task1(TaskH5Pandas):
    def run(self):
        df = pd.DataFrame({'a':range(10)})
        self.save(df)

class Task2(d6tflow.tasks.TaskCachePandas):

    def requires(self):
        return Task1()

    def run(self):
        df = self.input().load()
        # use dataframe from HDF5

d6tflow.run([Task2])

要查看https://d6tflow.readthedocs.io/en/latest/targets.html#writing-your-own-targets的扩展方式。