`RecordBatch` 能做什么而 `StructArray` 不能?

What can a `RecordBatch` do that a `StructArray` cannot?

在 Arrow 中存在的不同类型的数组中,StructArray 就是其中之一。当使用 PyArrow 转换为 pandas 结构时,它 returns 具有许多行的 pd.Series,每行包含一个字典:

>>> pa.array([{'x': 1, 'y': True}, {'z': 3.4, 'x': 4}]).to_pandas()
0    {'x': 1.0, 'y': True, 'z': None}
1     {'x': 4.5, 'y': None, 'z': 3.4}
dtype: object

另一方面,RecordBatch 将自己宣传为“等长数组实例的集合”:

>>> pa.RecordBatch.from_pylist([{'x': 1, 'y': True, 'z': None}, {'z': 3.4, 'x': 4.5}]).to_pandas()
     x     y    z
0  1.0  True  NaN
1  4.5  None  3.4

然而,即使一个采用 pd.Series 的形式,另一个采用 pd.DataFrame 的形式,在我看来,它们本质上都包含相同的信息。一个是数组,一个是数组的集合

因此,RecordBatch 可以做什么而 StructArray 不能?

它们是不同的抽象。 StructArray 是具有关联类型的数组;这是一个嵌套数组。 RecordBatch 是一个……RecordBatch 并包含一个模式;抽象地说,它是一个二维数据块,其中每一列在内存中都是连续的。

它们有意具有相似的接口,因为它们彼此“看起来相似”,但是例如,StructArray 不能单独写入文件;它需要被包装并转换成 RecordBatch。

此外,StructArray(作为一个数组)有一个 top-level 有效性位图(即它的每个子数组都有自己的有效性信息,StructArray 本身也是如此)。但是 RecordBatch 没有自己的有效性位图。