在 C++ 中将 Apache Arrow Table 转换为 RecordBatch

Converting Apache Arrow Table to RecordBatch in c++

我想从 std::shared_ptr<arrow::Table> 中获得 std::shared_ptr<arrow::RecordBatch> 作为

std::shared_ptr<arrow:Table> table = ...
auto rb = std::RecordBatch::Make(table->schema(), table->num_rows(), table->columns()).ValueorDie();

但是编译器抱怨有 no known conversion from 'const vector<shared_ptr<arrow::ChunkedArray>>' to 'vector<shared_ptr<arrow::Array>>' 因为 table->columns() 当然 returns vector<shared_ptr<arrow::ChunkedArray>>。我似乎无法将 arrow::ChunkedArray 转换为 arrow::Array。我翻阅了文档,但终究还是无法弄清楚如何做到这一点。

我该怎么做,或者,是否有另一种方法可以将 arrow::Table 转换为 arrow::RecordBatch

有一个辅助方法 arrow::Table::CombineChunksToBatch 应该会在 7.0.0 版本中可用。

在此期间您可以这样做:

  ARROW_ASSIGN_OR_RAISE(std::shared_ptr<Table> combined, table->CombineChunks(/*Can pass memory_pool here*/));
  std::vector<std::shared_ptr<Array>> arrays;
  for (const auto& column : combined->columns()) {
    arrays.push_back(column->chunk(0));
  }
  std::shared_ptr<RecordBatch> batch = RecordBatch::Make(table->schema(), table->num_rows(), std::move(arrays));

请记住,这不是零复制操作。 table 中的每一列都将由多个数组组成。当您调用 arrow::Table::CombineChunks 时,它需要为所有块分配一个足够大的新数组,然后它必须将数据从每个块复制到这个新数组。

如果可能的话,通常保留 table 或以流方式对其进行操作(例如,使用 arrow::TableBatchReader 并一次对一批进行操作)性能更高。