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个,遗漏了两个关键逻辑:
- partitionBy是本地拆分,不会跨分区洗牌:原DF的4个非空分区是独立的,Spark会在每个非空分区内按
col5的值拆分数据,每个非空分区中存在的col5值,会在对应目录下生成一个part文件。- 比如如果原4个非空分区的数据都属于同一个
col5值,该目录下会生成4个part文件;如果数据分散到3个col5值,可能出现2、1、1的文件数分布,而非任意1-4的范围。
- 比如如果原4个非空分区的数据都属于同一个
- 空的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
相关产品推荐
相关产品推荐

