使用 Parquet 存储多个不同宽度的数据帧?
Storing multiple dataframes of different widths with 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")
不,这是不可能的,因为 Parquet 文件只有一个模式。它们通常也不显示为单个文件,而是显示为目录中的多个文件,所有文件都是相同的模式。这使工具能够读取这些文件,就好像它们是一个文件一样,要么完全进入本地 RAM,分布在多个节点上,要么评估对它们的 (SQL) 查询。
Parquet 也能够有效地存储这些数据帧,即使是这么小的尺寸,因此它应该是适合您的用例的序列化格式。与 HDF5 相比,Parquet 只是表格数据的序列化。如您的问题所述,HDF5 还支持类似文件系统的键值访问。由于您有大量文件,这可能会对底层文件系统造成问题,因此您应该寻找该层的替代品。可能的方法是首先将 DataFrame 序列化为内存中的 Parquet,然后将其存储在键值容器中,这可以是简单的 zip 存档或真正的键值存储,例如LevelDB.
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")
不,这是不可能的,因为 Parquet 文件只有一个模式。它们通常也不显示为单个文件,而是显示为目录中的多个文件,所有文件都是相同的模式。这使工具能够读取这些文件,就好像它们是一个文件一样,要么完全进入本地 RAM,分布在多个节点上,要么评估对它们的 (SQL) 查询。
Parquet 也能够有效地存储这些数据帧,即使是这么小的尺寸,因此它应该是适合您的用例的序列化格式。与 HDF5 相比,Parquet 只是表格数据的序列化。如您的问题所述,HDF5 还支持类似文件系统的键值访问。由于您有大量文件,这可能会对底层文件系统造成问题,因此您应该寻找该层的替代品。可能的方法是首先将 DataFrame 序列化为内存中的 Parquet,然后将其存储在键值容器中,这可以是简单的 zip 存档或真正的键值存储,例如LevelDB.