为何Dask中Parquet文件的分区逻辑与CSV文件不一致
Dask Parquet 与 CSV 分区逻辑差异及chunksize生效规则说明
核心差异原因
- CSV 属于无结构行存储纯文本,
read_csv的chunksize是硬生效指标:Dask会直接按你设置的字节大小切割原始文本,仅遇到跨行记录时会有极小误差,所以你设置50MB块大小就能生成符合预期的30个分区。 - Parquet 属于带结构化元数据的列存储二进制文件,
read_parquet默认以文件内置的**Row Group(行组)**作为最小分区单元,不会拆分单个Row Group,也不会主动合并多个小Row Group,此时你设置的chunksize仅作参考,最终分区数量完全由源Parquet文件的Row Group划分规则决定,这就是你直接读取Parquet时分区不符合预期的核心原因。 - 调用
repartition(partition_size='50mb')后得到109个分区,是因为此处的partition_size统计的是加载到内存后的未压缩数据大小,而Parquet默认采用高压缩比存储,磁盘上的50MB压缩文件加载到内存后通常会膨胀到200MB500MB不等,按内存大小拆分后自然会得到远多于预期的分区数量。如果要达到和CSV处理时近似的分区数量,可以把`partition_size`调整为200MB300MB即可。
chunksize 对两类文件的生效规则区别
- 对CSV文件:
chunksize是硬限制,Dask会严格按设置的磁盘文件字节大小切分,最终分区大小和设置值误差不超过10%。 - 对Parquet文件:
chunksize是软限制,仅用于过滤匹配大小接近的完整Row Group,不会修改源文件的Row Group结构,最终分区大小可能和设置值相差数倍。
内容的提问来源于stack exchange,提问作者Lucas Leão
相关产品推荐
相关产品推荐

