如果“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 文件,我如何读取它们?
您应该在 parquet 代码周围添加一个 try/catch 块并记录抛出的异常。我猜问题是您所链接的 arrow 版本没有链接的快速压缩库。