2

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

正常尴尬的镶木地板存储

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

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(没有尴尬)

有关 Parquet 文件的 pyarrow 文档中,您可以使用以下命令扩展 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])

类似于 aawkward.table.schema或 an 的awkward.ParquetWriter()东西

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

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

4

1 回答 1

3

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

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

于 2019-12-05T18:29:58.137 回答