将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
相关产品推荐
相关产品推荐

