开发 Arrow C++ 计算模块#
本节提供 Arrow C++ 计算模块开发人员所需的信息。
行表 (Row Table)#
Arrow 中的行表以行主序格式存储数据。此格式特别适用于对单个行进行随机访问以及频繁同时访问所有列的场景。它对于哈希表键尤其有利,并且通过优化内存访问模式和数据局部性,有助于实现分组和哈希连接等高效操作。
元数据 (Metadata)#
行表由其元数据 RowTableMetadata 定义,其中包含有关其模式、对齐方式和派生属性的信息。
模式指定列的类型和顺序。行表中的每一行都以该逻辑顺序(物理顺序可能有所不同;详情请参阅行编码)包含每列的数据。
注意
行表不支持嵌套类型或大型二进制类型的列。
从模式派生出的一个重要属性是行表是定长还是变长。定长行表仅包含定长列,而变长行表至少包含一个变长列。此区别决定了行表中数据的存储和访问方式。
行表中的每一行都按照 RowTableMetadata::row_alignment 字节对齐。长度不是 2 的幂的定长列也按照 RowTableMetadata::row_alignment 字节对齐。变长列按照 RowTableMetadata::string_alignment 字节对齐。
缓冲区布局 (Buffer Layout)#
与大多数 Arrow Array 类似,行表由三个缓冲区组成:
空值掩码缓冲区 (Null Masks Buffer):指示每行中每列的空值。
定长缓冲区 (Fixed-length Buffer):存储定长表中的行数据,或变长表中的变长数据的偏移量。
变长缓冲区 (Varying-length Buffer)(可选):包含变长表中的行数据;定长表不使用。
行格式 (Row Format)#
空值掩码 (Null Masks)#
对于每一行,连续的位序列表示该行中每列是否为空。每个位对应一个特定的列,其中 1 表示该值为 null,0 表示该值有效。请注意,这与 Array 的有效位图的工作方式相反。一行的空值掩码占用 RowTableMetadata::null_masks_bytes_per_row 字节。
定长行数据 (Fixed-length Row Data)#
在定长行表中,行数据直接存储在定长缓冲区中。每行中的所有列按顺序存储。值得注意的是,boolean 列是特殊的,因为在普通的 Arrow Array 中,它使用 1 位存储,而在行表中,它占用 1 字节。在这种情况下不使用变长缓冲区。
例如,一个模式为 (int32, boolean) 且行数据为 [[7, false], [8, true], [9, false], ...] 的行表在定长缓冲区中存储如下:
行 0 |
行 1 |
行 2 |
… |
|---|---|---|---|
|
|
|
… |
变长行数据的偏移量 (Offsets for Varying-length Row Data)#
在变长行表中,定长缓冲区包含指向变长行数据的偏移量,这些数据单独存储在可选的变长缓冲区中。偏移量类型为 RowTableMetadata::offset_type(固定为 int64_t),并指示每行数据的起始位置。
变长行数据 (Varying-length Row Data)#
在变长行表中,变长缓冲区包含实际的行数据,它们连续存储。定长缓冲区中的偏移量指向每行数据的起始位置。
行编码 (Row Encoding)#
变长行编码如下:
首先存储定长列。
接着是每个变长列的偏移量序列。每个偏移量都是 32 位,指示相应变长列在行数据中的结束位置。
最后存储变长列。
例如,一个模式为 (int32, string, string, int32) 且行数据为 [[7, 'Alice', 'x', 0], [8, 'Bob', 'y', 1], [9, 'Charlotte', 'z', 2], ...] 的行表存储如下(假设变长列为 8 字节对齐):
定长缓冲区 (行偏移量)
行 0 |
行 1 |
行 2 |
行 3 |
… |
|---|---|---|---|---|
|
|
|
|
… |
变长缓冲区 (行数据)
行 |
定长列 |
变长偏移量 |
变长列 |
|---|---|---|---|
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3 |
… |
… |
… |