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

Tur*_*uro 7 python pandas apache-spark parquet

Parquet 是否支持在单个文件中存储不同宽度(列数)的各种数据框?例如,在 HDF5 中,可以存储多个此类数据帧并通过密钥访问它们。到目前为止,从我的阅读来看,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")
Run Code Online (Sandbox Code Playgroud)

Uwe*_*orn 11

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

即使尺寸如此之小,Parquet 也能够有效地存储这些数据帧,因此它应该是适合您的用例的序列化格式。与 HDF5 相比,Parquet 只是表格数据的序列化。正如您的问题中提到的,HDF5 还支持类似文件系统的键值访问。由于您有大量文件,这可能会给底层文件系统带来问题,因此您应该考虑寻找该层的替代品。可能的方法是首先将 DataFrame 序列化为内存中的 Parquet,然后将其存储在键值容器中,这可以是一个简单的 zip 存档,也可以是一个真正的键值存储,例如 LevelDB。