You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark DataFrame分区后S3存储文件数的面试疑问求解

Spark写入S3的Part文件数问题解析

问题1:20个分区的DF(4个非空、16个空)保存到S3的Part文件数

你的回答认为会生成20个文件(4个有数据、16个空),遗漏了Spark的默认配置行为:

  • Spark默认参数spark.sql.sources.emptyPartitionFile为false,不会为没有数据的分区生成空的part文件。
  • 因此最终只会生成4个包含数据的part文件,16个空分区不会产生任何文件。

场景1:df.partitionBy("col5").write.format("parquet").save("s3_path_1")的Part文件分布

你的回答称每个col5目录下part文件数为1-4个,遗漏了两个关键逻辑:

  1. partitionBy是本地拆分,不会跨分区洗牌:原DF的4个非空分区是独立的,Spark会在每个非空分区内按col5的值拆分数据,每个非空分区中存在的col5值,会在对应目录下生成一个part文件。
    • 比如如果原4个非空分区的数据都属于同一个col5值,该目录下会生成4个part文件;如果数据分散到3个col5值,可能出现2、1、1的文件数分布,而非任意1-4的范围。
  2. 空的col5目录无part文件:如果某个col5值在所有非空分区中都没有数据,对应的目录会被创建,但不会生成任何part文件,你的回答没有考虑到这种空目录的情况。

场景2:df.repartition(5).partitionBy("col5").write.format("parquet").save("s3_path_2")的Part文件分布

你的回答称每个目录下part文件数为1-5个,遗漏了核心的分布逻辑:

  • repartition(5)会对全量数据进行洗牌,生成5个非空分区(假设总数据非空)。之后partitionBy("col5")会在每个分区内按col5值拆分数据,每个col5目录下的part文件数等于包含该col5值的repartition分区数量。
    • 比如如果所有数据都属于同一个col5值,该目录下会生成5个part文件;如果某个col5值仅在2个repartition分区中存在,对应目录下就是2个part文件。
  • 同时,不存在数据的col5目录依然不会生成part文件,你的回答没有明确区分“有数据的col5目录”和“空目录”的差异,且错误地认为每个目录都可能出现1-5的任意数量,实际数量完全由repartition后的数据分布决定。

内容的提问来源于stack exchange,提问作者Dipanjan Mallick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:25:06