如何读取使用 C++ apache-arrow 包快速压缩的 parquet 文件?

问题描述 投票:0回答:1

如果“b.parquet”尚未压缩,我使用以下代码成功读取 parquet 文件。

#include <iostream>
#include <arrow/api.h>
#include <arrow/io/api.h>
#include <arrow/ipc/reader.h>
#include <arrow/util/logging.h>
#include <arrow/ipc/api.h>
#include <parquet/arrow/reader.h>
#include <parquet/arrow/writer.h>


arrow::Status RunMain() {

    auto pool = arrow::default_memory_pool();

    std::shared_ptr<arrow::io::ReadableFile> file;
    ARROW_ASSIGN_OR_RAISE(file, arrow::io::ReadableFile::Open("b.parquet"));

    std::unique_ptr<parquet::arrow::FileReader> reader;
    PARQUET_THROW_NOT_OK(parquet::arrow::OpenFile(file, arrow::default_memory_pool(), &reader));

    std::shared_ptr<arrow::Table> parquet_table;
    PARQUET_THROW_NOT_OK(reader->ReadTable(&parquet_table));
 
    std::cout << "Table Data:\n";
    std::cout << parquet_table->ToString() << std::endl;

    return arrow::Status::OK();
}

int main() {
    arrow::Status st = RunMain();
    if (!st.ok()) {
        std::cerr << st << std::endl;
        return 1;
    }
    return 0;
}

但是,当我将“b.parquet”替换为压缩包时。控制台会显示乱码,如:

顺便说一句,“b.parquet”实际上是由以下Python代码组成的。并且函数“pandas.dataframe.to_parquet”似乎默认使用快速压缩。

b = pd.DataFrame([[1,2,3,4],[2,2,3,4],[4,5,6,7],[9,10,11,101]])
b.to_parquet('b.parquet')

如果我稍微改变一下上面的Python代码,比如:

b = pd.DataFrame([[1,2,3,4],[2,2,3,4],[4,5,6,7],[9,10,11,101]])
b.to_parquet('b.parquet', compression=None)

然后,C++ 代码就可以工作了。 所以,我的问题是:如果我有很多已经压缩的 parquet 文件,我如何读取它们?

c++ parquet apache-arrow snappy
1个回答
0
投票

您应该在 parquet 代码周围添加一个 try/catch 块并记录抛出的异常。我猜问题是您所链接的 arrow 版本没有链接的快速压缩库。

© www.soinside.com 2019 - 2024. All rights reserved.