apache arrow 中压缩 IO 函数的使用
Usage of compression IO functions in apache arrow
我一直在为基因组学工具集实施一套 RecordBatchReader。标准工作单元是 RecordBatch。我最终实现了很多我自己的压缩和 IO 工具,而不是使用 arrow cpp 平台中的现有实用程序,因为我对它们感到困惑。是否有使用现有压缩和文件 IO 实用程序来简单地获取膨胀标准 zlib 数据的文件流的明确示例?此外,cpp 平台的对象图将有助于提升。
这里是一个示例程序,它扩展了一个压缩的 zlib 文件并将其读取为 CSV。
#include <iostream>
#include <arrow/api.h>
#include <arrow/csv/api.h>
#include <arrow/io/api.h>
#include <arrow/util/compression.h>
#include <arrow/util/logging.h>
arrow::Status RunMain(int argc, char **argv) {
if (argc < 2) {
return arrow::Status::Invalid(
"You must specify a gzipped CSV file to read");
}
std::string file_to_read = argv[1];
ARROW_ASSIGN_OR_RAISE(auto in_file,
arrow::io::ReadableFile::Open(file_to_read));
ARROW_ASSIGN_OR_RAISE(auto codec,
arrow::util::Codec::Create(arrow::Compression::GZIP));
ARROW_ASSIGN_OR_RAISE(
auto compressed_in,
arrow::io::CompressedInputStream::Make(codec.get(), in_file));
auto read_options = arrow::csv::ReadOptions::Defaults();
auto parse_options = arrow::csv::ParseOptions::Defaults();
auto convert_options = arrow::csv::ConvertOptions::Defaults();
ARROW_ASSIGN_OR_RAISE(
auto table_reader,
arrow::csv::TableReader::Make(arrow::io::default_io_context(),
std::move(compressed_in), read_options,
parse_options, convert_options));
ARROW_ASSIGN_OR_RAISE(auto table, table_reader->Read());
std::cout << "The table had " << table->num_rows() << " rows and "
<< table->num_columns() << " columns." << std::endl;
return arrow::Status::OK();
}
int main(int argc, char **argv) {
arrow::Status st = RunMain(argc, argv);
if (!st.ok()) {
std::cerr << st << std::endl;
return 1;
}
return 0;
}
Arrow 的不同部分以不同的方式处理压缩。文件阅读器通常接受 arrow::io::InputStream
。你应该能够使用 arrow::io::CompressedInputStream
来包装一个 arrow::io::InputStream
并解压。这为您提供了整个文件压缩。这对于像 CSV 这样的东西很好。
对于 Parquet,此方法不起作用(ParquetFileReader::Open
期望 arrow::io::RandomAccessFile
)。对于 IPC,这种方法效率低下(除非您正在读取整个文件)。有效读取这些格式涉及可寻址读取,这在整个文件压缩中是不可能的。两种格式都支持它们自己的特定于格式的压缩选项。您只需要在写入时指定这些选项。在读取时,将从文件本身的元数据(元数据未压缩存储)中检测到压缩。如果您正在写入数据,您可以在 parquet::ArrowWriterProperties
和 arrow::ipc::WriteOptions
.
中找到相关信息
由于整个文件压缩仍然是 CSV 的事情,数据集 API 最近(从 4.0.0 开始)添加了对检测 CSV 数据集文件扩展名压缩的支持。可以找到更多详细信息 here.
至于文档和对象图,这些都是用户邮件列表的绝佳主题,或者欢迎您提供拉取请求。
我一直在为基因组学工具集实施一套 RecordBatchReader。标准工作单元是 RecordBatch。我最终实现了很多我自己的压缩和 IO 工具,而不是使用 arrow cpp 平台中的现有实用程序,因为我对它们感到困惑。是否有使用现有压缩和文件 IO 实用程序来简单地获取膨胀标准 zlib 数据的文件流的明确示例?此外,cpp 平台的对象图将有助于提升。
这里是一个示例程序,它扩展了一个压缩的 zlib 文件并将其读取为 CSV。
#include <iostream>
#include <arrow/api.h>
#include <arrow/csv/api.h>
#include <arrow/io/api.h>
#include <arrow/util/compression.h>
#include <arrow/util/logging.h>
arrow::Status RunMain(int argc, char **argv) {
if (argc < 2) {
return arrow::Status::Invalid(
"You must specify a gzipped CSV file to read");
}
std::string file_to_read = argv[1];
ARROW_ASSIGN_OR_RAISE(auto in_file,
arrow::io::ReadableFile::Open(file_to_read));
ARROW_ASSIGN_OR_RAISE(auto codec,
arrow::util::Codec::Create(arrow::Compression::GZIP));
ARROW_ASSIGN_OR_RAISE(
auto compressed_in,
arrow::io::CompressedInputStream::Make(codec.get(), in_file));
auto read_options = arrow::csv::ReadOptions::Defaults();
auto parse_options = arrow::csv::ParseOptions::Defaults();
auto convert_options = arrow::csv::ConvertOptions::Defaults();
ARROW_ASSIGN_OR_RAISE(
auto table_reader,
arrow::csv::TableReader::Make(arrow::io::default_io_context(),
std::move(compressed_in), read_options,
parse_options, convert_options));
ARROW_ASSIGN_OR_RAISE(auto table, table_reader->Read());
std::cout << "The table had " << table->num_rows() << " rows and "
<< table->num_columns() << " columns." << std::endl;
return arrow::Status::OK();
}
int main(int argc, char **argv) {
arrow::Status st = RunMain(argc, argv);
if (!st.ok()) {
std::cerr << st << std::endl;
return 1;
}
return 0;
}
Arrow 的不同部分以不同的方式处理压缩。文件阅读器通常接受 arrow::io::InputStream
。你应该能够使用 arrow::io::CompressedInputStream
来包装一个 arrow::io::InputStream
并解压。这为您提供了整个文件压缩。这对于像 CSV 这样的东西很好。
对于 Parquet,此方法不起作用(ParquetFileReader::Open
期望 arrow::io::RandomAccessFile
)。对于 IPC,这种方法效率低下(除非您正在读取整个文件)。有效读取这些格式涉及可寻址读取,这在整个文件压缩中是不可能的。两种格式都支持它们自己的特定于格式的压缩选项。您只需要在写入时指定这些选项。在读取时,将从文件本身的元数据(元数据未压缩存储)中检测到压缩。如果您正在写入数据,您可以在 parquet::ArrowWriterProperties
和 arrow::ipc::WriteOptions
.
由于整个文件压缩仍然是 CSV 的事情,数据集 API 最近(从 4.0.0 开始)添加了对检测 CSV 数据集文件扩展名压缩的支持。可以找到更多详细信息 here.
至于文档和对象图,这些都是用户邮件列表的绝佳主题,或者欢迎您提供拉取请求。