在 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
并一次对一批进行操作)性能更高。
我想从 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
并一次对一批进行操作)性能更高。