问题描述
是否可以使用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"])