从单个 Arrow 文件中读取多个表

Reading mutliple tables from single Arrow file

我创建了一个包含多个 table 的 Arrow IPC 文件。如何使用 pyarrow 逐一阅读 table?有例子吗?

根据 Tabular Datasets 的文档,我只能读取文件中最后写的 table。

该文件是用 C++ 生成的,通过多次调用:

// table is a std::shared_ptr<arrow::Table> containing each
// time a table, multiple different schemas are used. filePath
// is an std::string with the destination file path.
// myFile is an std::shared_ptr<arrow::io::FileOutputStream>
// created with
// arrow::io::FileOutputStream::Open(params.outputPath,true)
//    .ValueOrDie()
void arrowTableWrite() {
    ARROW_ASSIGN_OR_RAISE(auto writer, arrow::ipc::MakeFileWriter(myFile->get(), table->schema()));
    writer->WriteTable(*table);
    writer->Close();
}

正在尝试读取创建的文件 python:

import pyarrow as pa
import sys

if __name__ == "__main__":
    with pa.OSFile(sys.argv[1], 'rb') as source:
        table = pa.ipc.open_file(source).read_all()
        print(table)

以上打印:

pyarrow.Table
id: int32 not null
value: binary not null

我希望看到文件中包含的所有 table,我已验证数据已写入。

在与 Micah Kornfield 的评论中讨论后,澄清了 IPC file 格式不支持在同一文件中写入多个表。

要支持这一功能,可以使用 IPC stream 格式。具体来说,不是使用 MakeFileWriter 创建文件编写器,而是使用 MakeStreamWriter 创建的文件可以支持多个表,可能具有不同的架构,写入同一个 IPC 文件。

MakeStreamWriter documentantion