Parquet是否支持在单个文件中存储不同宽度(列数)的各种数据帧?例如。在HDF5中,可以存储多个这样的数据帧并通过密钥访问它们。到目前为止,从我的reading看起来Parquet不支持它,所以替代方案是将多个Parquet文件存储到文件系统中。我有一个相当大的数量(比如10000)的相对较小的帧〜1-5MB来处理,所以我不确定这是否会成为一个问题?
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
dfs = []
df1 = pd.DataFrame(data={"A": [1, 2, 3], "B": [4, 5, 6]},
columns=["A", "B"])
df2 = pd.DataFrame(data={"X": [1, 2], "Y": [3, 4], "Z": [5, 6]},
columns=["X", "Y", "Z"])
dfs.append(df1)
dfs.append(df2)
for i in range(2):
table1 = pa.Table.from_pandas(dfs[i])
pq.write_table(table1, "my_parq_" + str(i) + ".parquet")
答案 0 :(得分:1)
不,这是不可能的,因为Parquet文件只有一个模式。它们通常也不会显示为单个文件,而是显示为目录中的多个文件,其中所有文件都是相同的模式。这使得工具可以像读取这些文件一样读取这些文件,或者完全读入本地RAM,分布在多个节点上或者对它们评估(SQL)查询。
即使对于这么小的尺寸,Parquet也能够有效地存储这些数据帧,因此它应该是适合您的用例的序列化格式。与HDF5相比,Parquet只是表格数据的序列化。正如您的问题所述,HDF5还支持类似文件系统的密钥访问。由于您有大量文件,这可能对底层文件系统有问题,因此您应该查找此层的替代品。可能的方法是首先将DataFrame序列化为Parquet in-memory,然后将其存储在键值容器中,这可以是简单的zip存档或真正的键值存储,例如,性LevelDB。