是否可以将行附加到现有箭头 (PyArrow) Table?

Is it possible to append rows to an existing Arrow (PyArrow) Table?

我知道“许多 Arrow 对象是不可变的table:一旦构建,它们的逻辑属性就不能再改变”(docs). In this blog post by one of the Arrow creators据说

Table columns in Arrow C++ can be chunked, so that appending to a table is a zero copy operation, requiring no non-trivial computation or memory allocation.

但是,我无法在文档中找到如何将一行附加到 table。 pyarrow.concat_tables(tables, promote=False) 做了类似的事情,但据我了解,它会生成一个新的 Table 对象,而不是向现有对象添加块。

我不确定这个操作是否完全 possible/makes 有意义(在这种情况下我想知道如何)或者如果没有(在这种情况下,pyarrow.concat_tables 是正是我需要的)。

类似问题:

基本上,PyArrow/Arrow C++ 中的 Table 并不是真正的数据本身,而是由指向数据的指针组成的容器。它是如何工作的:

  • Buffer 表示实际的单一分配。换句话说,缓冲区是连续的,句号。它们可能是可变的或不可变的。
  • 一个数组包含 0+ 个缓冲区并在其中强加了某种语义。 (例如,整数数组或字符串数​​组。)数组是“连续的”,因为每个缓冲区都是连续的,并且从概念上讲,“列”不是“拆分”到多个缓冲区。 (这对于嵌套数组来说真的很模糊:在某种意义上,结构数组确实将其数据拆分到多个缓冲区!我需要对此提出更好的措辞,并将其贡献给上游文档。但我希望我的意思是这里很清楚。)
  • 一个 ChunkedArray 包含 0+ 个数组。 ChunkedArray 在逻辑上不是连续的。它有点像数据块的链表。两个 ChunkedArrays 可以连接“零复制”,即 底层缓冲区 不会被复制。
  • A Table 包含 0+ 个 ChunkedArray。 Table 是一个二维数据结构(列和行)。
  • 一个 RecordBatch 包含 0+ 个数组。 RecordBatch 也是一个二维数据结构。

因此,您可以通过仅复制指针将两个 Table 的“零复制”与 pyarrow.concat_tables 连接起来。但是你不能连接两个 RecordBatches “零复制”,因为你必须连接数组,然后你必须从缓冲区中复制数据。