熊猫df.to_parquet写入多个较小的文件

问题描述

是否可以使用Pandas的DataFrame.to_parquet功能将写入拆分为多个大约所需大小的文件

我有一个非常大的DataFrame(100M x 100),并且正在使用df.to_parquet('data.snappy',engine='pyarrow',compression='snappy')写入文件,但这导致文件大小约为4GB。相反,我希望将其拆分为许多〜100MB的文件

解决方法

我最终使用了Dask:

import dask.dataframe as da

ddf = da.from_pandas(df,chunksize=5000000)
save_dir = '/path/to/save/'
ddf.to_parquet(save_dir)

这将保存到save_dir内的多个镶木文件中,其中每个子DataFrame的行数为chunksize。根据您的dtypes和列数,您可以对其进行调整以使文件达到所需的大小。

,

另一个选择是使用partition_cols中的pyarrow.parquet.write_to_dataset()选项:

import pyarrow.parquet as pq
import numpy as np

# df is your dataframe
n_partition = 100
df["partition_idx"] = np.random.choice(range(n_partition),size=df.shape[0])
table = pq.Table.from_pandas(df,preserve_index=False)
pq.write_to_dataset(table,root_path="{path to dir}/",partition_cols=["partition_idx"])