微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

apache箭头中压缩IO函数的使用

如何解决apache箭头中压缩IO函数的使用

我一直在为基因组学工具集实现一套 RecordBatchReaders。标准的工作单元是 RecordBatch。我最终实现了很多我自己的压缩和 IO 工具,而不是使用箭头 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::CompressedInputStreamarrow::io::InputStream 与解压缩包装在一起。这为您提供全文件压缩。这对于像 CSV 这样的东西来说很好。

对于 Parquet,这种方法不起作用(ParquetFileReader::Open 期望 arrow::io::RandomAccessFile)。对于 IPC,这种方法效率低下(除非您正在读取整个文件)。这些格式的有效读取涉及可查找读取,这在整个文件压缩中是不可能的。这两种格式都支持它们自己的特定于格式的压缩选项。您只需要在写入时指定这些选项。读取时,将从文件本身的元数据(元数据未压缩存储)中检测压缩。如果您正在写入数据,您可以在 parquet::ArrowWriterPropertiesarrow::ipc::WriteOptions 中找到信息。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?