arrow系列16---表格数据(Tabular Data)
作者:yunjinqi   类别:    日期:2023-10-15 20:50:11    阅读:118 次   消耗积分:0 分    

虽然数组和分块数组代表同质值的一维序列,但数据通常呈现为异构数据的二维集合(如数据库表、CSV 文件等)。Arrow 提供了几种抽象,以便方便且高效地处理此类数据。

字段 

字段用于表示表格的特定列(以及嵌套数据类型,如 arrow::StructType 的特定成员)。

字段,即 arrow::Field 的实例,将数据类型、字段名称和一些可选的元数据组合在一起。

创建字段的推荐方式是调用 arrow::field() 工厂函数。

模式 

模式描述了两维数据集的整体结构,如表格。它包含一系列字段,还可以包含一些可选的全局模式元数据(除了每个字段的元数据)。创建模式的推荐方式是调用 arrow::schema() 工厂函数的其中一种重载:

// 创建描述包含两列数据集的模式:
// 一个名为 "A" 的 int32 列和一个名为 "B" 的 utf8 编码字符串列
std::shared_ptrarrow::Field field_a, field_b;
std::shared_ptrarrow::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() 工厂函数的重载。

表格arrow::Table 是一个包含列的二维数据集,每一列都有分块数组,同时提供字段名称的模式。此外,每个分块列在元素数量上必须具有相同的逻辑长度(尽管每一列可以以不同的方式分块)。

记录批处理

arrow::RecordBatch 是一组连续数组的二维数据集,每个数组的长度相同。与表格一样,记录批处理也有一个必须与其数组的数据类型匹配的模式。

记录批处理是各种序列化和计算函数的便捷工作单元,可能是渐进式的。

截图 2023-10-15 20-48-36.png

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

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


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/349
上一篇:arrow系列15---数据类型(Data Types)
下一篇:arrow系列17---计算函数(Compute Functions)