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

将DataFrame保存到HDFS文本文件时生成文件数超出记录总数问题

问题分析与解决办法

嗨,我来帮你理清这个问题~

首先,为什么会出现part文件数量超过记录总数的情况?这是因为Spark的RDD是基于**分区(Partition)**工作的:

  • 当你调用saveAsTextFile时,Spark会为RDD的每个分区生成一个对应的part-xxxxxx文件,不管这个分区里有没有数据。
  • 如果你的RDD分区数比记录总数(165条)多,自然就会生成更多的part文件,甚至有些分区是空的(对应大小为0的part文件)。
  • 另外,_SUCCESS文件是Spark任务完成的标记文件,它本身是空的,属于正常生成的文件,不用在意。

解决方法

你可以通过调整RDD的分区数来控制生成的part文件数量,有两种常用方式:

1. 使用coalesce(推荐,尽量避免数据洗牌)

如果只是想减少分区数,coalesce会尽量合并现有分区,避免不必要的shuffle操作。比如你想把文件合并成1个(或者根据需求设置合适的数量,比如2个):

// 合并为1个分区,生成1个part文件
r.rdd.coalesce(1).saveAsTextFile("top3_text")

// 或者合并为2个分区,生成2个part文件
r.rdd.coalesce(2).saveAsTextFile("top3_text")

2. 使用repartition(会触发数据洗牌)

如果需要重新均匀分布数据(比如分区数要增加,或者原分区数据分布不均),可以用repartition,它会强制进行shuffle:

// 重新设置为2个分区
r.rdd.repartition(2).saveAsTextFile("top3_text")

补充说明

Spark默认的分区数通常由集群配置决定:

  • 比如spark.default.parallelism(默认值和集群CPU核心数相关)或者spark.sql.shuffle.partitions(SQL操作的默认分区数,默认是200),这就是为什么你会看到part-00025、part-00026这么大的序号——因为默认分区数远大于你的记录数165。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:13:14