尴尬的数组:可以将数组附加到现有的 Parquet 文件吗?

AwkwardArray: Possible to append an array to an exisitng Parquet file?

是否可以使用 AwkwardArray (awkward0) 附加到现有的镶木地板文件(由 AwkwardArray 编写)?

普通笨拙的 Parquet 存储

以下代码创建一个 Parquet 文件,其中包含一些笨拙的数组(例如音频数据):

import numpy as np
import awkward as awk
import pyarrow.parquet as pq

# create Awkward Table from dict with numpy arrays
awk_array = awk.fromiter([{"ch0": np.array([0, 1, 2]), "ch1": np.array([3, 4, 5])},
                        {"ch0": np.array([6, 7]), "ch1": np.array([8, 9])}])
awk_array.tolist()
# [{'ch0': [0, 1, 2], 'ch1': [3, 4, 5]}, {'ch0': [6, 7], 'ch1': [8, 9]}]

# save in Parquet format
awk.toparquet("audio.parquet", awk_array)

# check if we can successfully load again; success
awk.fromparquet("audio.parquet")["ch0"].tolist()
# [[0, 1, 2], [6, 7]]

追加 Parquet(没有尴尬)

pyarrow documentation about Parquet files 中,您可以使用以下命令扩展 Parquet 文件:

with pq.ParquetWriter('example3.parquet', table.schema) as writer:
    for i in range(3):
        writer.write_table(table)

问题

Awkward 数组可能会这样吗?:

akw_arrays = []
akw_arrays.append(awk.fromiter([{"ch0": np.array([0, 1, 2]), "ch1": np.array([3, 4, 5])}]))
akw_arrays.append(awk.fromiter([{"ch0": np.array([6, 7]), "ch1": np.array([8, 9])}]))

# Awkward table schema
with pq.ParquetWriter("audio_append.parquet", awk.table.schema) as writer:
    for i in range(len(akw_arrays)):
        writer.write_table(akw_arrays[i])

类似 awkward.table.schemaawkward.ParquetWriter() 的东西?

实际上,我不会同时拥有两个数组。因此,在写入之前连接是不可能的。

或者是唯一的可能性是使用 Apache Arrow 之类的东西,并在最后一次将所有内容写入磁盘?

答案是否定的,但没有充分的理由不这样做。如您所示,您可以附加到 Parquet,实际上 Awkward 在编写 ChunkedArrays (arrow.py#L418-L440) 时使用它。一个不同的界面,重用你在那里看到的大部分代码,可以让 Parquet 文件保持打开状态以进行附加。这对于大型数据集非常有用。

由于 Parquet 文件是从页脚导航的(根据文件末尾的定义),我认为 Parquet 文件在关闭后不可追加。 (有些东西必须使原始页脚无效或覆盖。)所以这个迭代写入 Parquet 文件的尴尬接口必须在 with 块中打开 Parquet 文件,以确保这个页脚只写一次。