`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 没有自己的有效性位图。
在 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 没有自己的有效性位图。