按大小重新分区,dask 不生成预期大小的文件

Repartition by size with dask not producing files with expected size

我想使用 dask repartition 功能,但是请求的大小没有达到,生成的文件较小。

import pandas as pd
import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq
import dask.dataframe as dd

file = 'example.parquet'
file_res_dd = 'example_res'

# Generate a random df and write it down as an input data file.
df = pd.DataFrame(np.random.randint(100,size=(100000, 20)),columns=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'])
table = pa.Table.from_pandas(df)
pq.write_table(table, file, version='2.0')

# Read back with dask, repartition, and write it down.
dd_df = dd.read_parquet(file, engine='pyarrow')
dd_df = dd_df.repartition(partition_size='1MB')
dd_df.to_parquet(file_res_dd, engine='pyarrow')

在这个例子中,我希望文件大小约为 1MB。 第一个写入的输入文件大约为 1.7MB,所以我预计最多有 2 个文件。 但是在创建的 example_res 文件夹中,我得到 9 个文件,大约 270kB。

为什么会这样?

感谢您的帮助!最佳,

“分区大小”是内存中的表示形式,只是一个近似值。

Parquet 提供了各种编码和压缩选项,这些选项通常会使文件小很多 - 但小多少在很大程度上取决于所讨论的特定数据。