表格数据#

虽然数组和分块数组表示一维同类值序列,但数据通常以二维异类数据集合的形式出现(如数据库表、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 是一个包含一定数量连续数组的二维数据集,每个数组的长度相同。与表类似,记录批次也具有模式,该模式必须与其数组的数据类型匹配。

记录批次是各种序列化和计算函数(可能是增量的)的方便工作单元。

A graphical representation of an Arrow Table and a Record Batch, with structure as described in text above.

记录批次可以在实现之间发送,例如通过 IPC 或通过 C 数据接口。另一方面,表和分块数组是 C++ 实现中的概念,而不是 Arrow 格式本身,因此它们不能直接移植。

但是,可以轻松地将表转换为一系列记录批次,并从一系列记录批次构建表,而无需复制底层数组缓冲区。可以使用 arrow::TableBatchReader 将表流式传输为任意数量的记录批次。相反,可以使用 arrow::Table::FromRecordBatches() 工厂函数的重载之一将逻辑记录批次序列组装成表。