尴尬的数组:可以将数组附加到现有的 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.schema
或 awkward.ParquetWriter()
的东西?
实际上,我不会同时拥有两个数组。因此,在写入之前连接是不可能的。
或者是唯一的可能性是使用 Apache Arrow 之类的东西,并在最后一次将所有内容写入磁盘?
答案是否定的,但没有充分的理由不这样做。如您所示,您可以附加到 Parquet,实际上 Awkward 在编写 ChunkedArrays
(arrow.py#L418-L440) 时使用它。一个不同的界面,重用你在那里看到的大部分代码,可以让 Parquet 文件保持打开状态以进行附加。这对于大型数据集非常有用。
由于 Parquet 文件是从页脚导航的(根据文件末尾的定义),我认为 Parquet 文件在关闭后不可追加。 (有些东西必须使原始页脚无效或覆盖。)所以这个迭代写入 Parquet 文件的尴尬接口必须在 with
块中打开 Parquet 文件,以确保这个页脚只写一次。
是否可以使用 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.schema
或 awkward.ParquetWriter()
的东西?
实际上,我不会同时拥有两个数组。因此,在写入之前连接是不可能的。
或者是唯一的可能性是使用 Apache Arrow 之类的东西,并在最后一次将所有内容写入磁盘?
答案是否定的,但没有充分的理由不这样做。如您所示,您可以附加到 Parquet,实际上 Awkward 在编写 ChunkedArrays
(arrow.py#L418-L440) 时使用它。一个不同的界面,重用你在那里看到的大部分代码,可以让 Parquet 文件保持打开状态以进行附加。这对于大型数据集非常有用。
由于 Parquet 文件是从页脚导航的(根据文件末尾的定义),我认为 Parquet 文件在关闭后不可追加。 (有些东西必须使原始页脚无效或覆盖。)所以这个迭代写入 Parquet 文件的尴尬接口必须在 with
块中打开 Parquet 文件,以确保这个页脚只写一次。