使用Parquet存储多个不同宽度的数据帧?

时间:2018-05-21 21:10:52

标签: python pandas apache-spark parquet

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")

1 个答案:

答案 0 :(得分:1)

不,这是不可能的,因为Parquet文件只有一个模式。它们通常也不会显示为单个文件,而是显示为目录中的多个文件,其中所有文件都是相同的模式。这使得工具可以像读取这些文件一样读取这些文件,或者完全读入本地RAM,分布在多个节点上或者对它们评估(SQL)查询。

即使对于这么小的尺寸,Parquet也能够有效地存储这些数据帧,因此它应该是适合您的用例的序列化格式。与HDF5相比,Parquet只是表格数据的序列化。正如您的问题所述,HDF5还支持类似文件系统的密钥访问。由于您有大量文件,这可能对底层文件系统有问题,因此您应该查找此层的替代品。可能的方法是首先将DataFrame序列化为Parquet in-memory,然后将其存储在键值容器中,这可以是简单的zip存档或真正的键值存储,例如,性LevelDB。