镶木地板是否允许定期附加到镶木地板文件?
追加与分区(如果有的话)有何关系?例如,如果我能够识别基数较低的列并按该列对其进行分区,如果我要向其中追加更多数据,parquet 是否能够在保留分区的同时自动追加数据,或者是否必须重新分区文件?
镶木地板是否允许定期附加到镶木地板文件?
是和否。 parquet 规范描述了一种可以通过读取现有页脚、写入行组,然后写出修改后的页脚来附加的格式。这个过程在here有一些描述。
并非所有实现都支持此操作。目前我知道的唯一实现是 fastparquet(请参阅这个答案)。缓存和批处理通常是可以接受的,复杂性较低,并且可能具有更好的性能,可以通过在内存中缓存或写入小文件并在稍后的某个时刻将它们批处理在一起。
追加与分区(如果有的话)有何关系?
Parquet 没有任何分区的概念。
许多支持 Parquet 的工具都实现了分区。例如,pyarrow 有一个支持分区的datasets 功能。如果您要使用此功能附加新数据,则会在适当的分区目录中创建一个新文件。
可以使用 fastparquet 将行组追加到现有的 parquet 文件中。
这是我对同一主题的SO答案。
append: bool (False) 或 ‘overwrite’ 如果为 False,则构造数据集 划痕;如果为 True,则将新行组添加到现有数据集。在里面 后一种情况,数据集必须存在,并且模式必须匹配 输入数据。
from fastparquet import write
write('output.parquet', df, append=True)
更新示例:
这是一个 PY 脚本。第一次运行,它将创建一个包含一个行组的文件。随后的运行,它将把行组附加到同一个镶木地板文件中。
import os.path
import pandas as pd
from fastparquet import write
df = pd.DataFrame(data={'col1': [1, 2,], 'col2': [3, 4]})
file_path = "C:\\Users\\nsuser\\dev\\write_parq_row_group.parquet"
if not os.path.isfile(file_path):
write(file_path, df)
else:
write(file_path, df, append=True)
正是如此。是否使用 fastparquet 附加数据取决于具体情况:
如果您的每一块数据都非常小,例如 10mb。这种情况会稍微损害性能。我建议你定期重建大和平。每个 Parquet 文件的合适大小为 500mb ~ 1Gb。
如果你的每一个数据都足够大,这种情况不会损害你的性能。