表格数据#
另请参阅
虽然数组和分块数组表示一维的同构值序列,但数据通常以二维的异构数据集的形式出现(例如数据库表、CSV 文件……)。Arrow 提供了几种抽象来方便有效地处理此类数据。
字段#
字段用于表示表的特定列(以及嵌套数据类型的特定成员,例如 arrow::StructType
)。字段,即 arrow::Field
的实例,将数据类型、字段名称和一些可选的元数据组合在一起。
创建字段的推荐方法是调用 arrow::field()
工厂函数。
模式#
模式描述了二维数据集(例如表)的整体结构。它将一系列字段与一些可选的模式范围元数据(除了每个字段的元数据)一起保存。创建模式的推荐方法是调用 arrow::schema()
工厂函数的其中一个重载函数。
// Create a schema describing datasets with two columns:
// a int32 column "A" and a utf8-encoded string column "B"
std::shared_ptr<arrow::Field> field_a, field_b;
std::shared_ptr<arrow::Schema> schema;
field_a = arrow::field("A", arrow::int32());
field_b = arrow::field("B", arrow::utf8());
schema = arrow::schema({field_a, field_b});
表#
arrow::Table
是一个二维数据集,其中列是分块数组,并带有一个提供字段名称的模式。此外,每个分块列必须具有相同的逻辑长度(元素数量),尽管每个列可以用不同的方式进行分块。
记录批次#
arrow::RecordBatch
是一个由多个连续数组组成的二维数据集,每个数组的长度相同。与表一样,记录批次也具有一个与其数组的数据类型匹配的模式。
记录批次是各种序列化和计算函数(可能是增量)的便捷工作单元。
记录批次可以在不同实现之间发送,例如通过 IPC 或通过 C 数据接口。另一方面,表和分块数组是 C++ 实现中的概念,而不是 Arrow 格式本身的概念,因此它们不能直接移植。
但是,可以轻松地将表转换为记录批次序列并从中构建表,而无需复制底层数组缓冲区。可以使用 arrow::TableBatchReader
将表作为任意数量的记录批次进行流式传输。相反,可以使用 arrow::Table::FromRecordBatches()
工厂函数的其中一个重载函数将记录批次的逻辑序列组装成一个表。