【问题标题】:Usage of compression IO functions in apache arrow [closed]apache箭头中压缩IO函数的使用[关闭]
【发布时间】:2021-06-02 05:13:49
【问题描述】:

我一直在为基因组学工具集实施一套 RecordBatchReaders。标准工作单元是 RecordBatch。我最终实现了很多我自己的压缩和 IO 工具,而不是使用箭头 cpp 平台中的现有实用程序,因为我对它们感到困惑。有没有使用现有压缩和文件 IO 实用程序来简单地获取膨胀标准 zlib 数据的文件流的明确示例?此外,cpp 平台的对象图将有助于提升。

【问题讨论】:

    标签: c++ io compression apache-arrow


    【解决方案1】:

    这是一个示例程序,它对压缩的 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::ArrowWriterPropertiesarrow::ipc::WriteOptions 中找到信息。

    由于整个文件压缩仍然适用于 CSV,因此数据集 API 最近(从 4.0.0 开始)增加了对从 CSV 数据集的文件扩展名中检测压缩的支持。更多详情请见here

    至于文档和对象图,这些都是用户邮件列表的绝佳主题,或者欢迎您提供拉取请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      相关资源
      最近更新 更多