如何用Spark将多行Dataset<String>写入单个TXT文件
解决Spark写入Dataset时生成多个文件的问题
Spark作为分布式计算框架,会根据Dataset的分区数量生成对应个数的输出文件——哪怕你只有3行数据,只要分区数大于1,就会产出多个小文件。要合并成单个文件,有两种常用方案:
方案一:合并分区后写入
直接通过coalesce(1)或repartition(1)将Dataset的分区数强制改为1,再执行写入操作:
- coalesce(1):不会触发数据shuffle,只是将现有分区的数据合并到一个分区,适合小数据量场景(比如你的3行数据),性能更好:
input.coalesce(1).write().mode(SaveMode.Overwrite).text("src/main/resources/avro/BVA_RET_20210618")
- repartition(1):会强制触发数据shuffle,把所有数据重新分配到一个分区,数据量小时和coalesce效果一致,但数据量大时可能带来额外开销。
方案二:全局设置分区数(不推荐)
如果你的整个Spark作业只需要处理这一个写入任务,可以在创建SparkSession时全局设置shuffle分区数为1:
SparkSession spark = SparkSession.builder() .appName("WriteSingleTxtFile") .config("spark.sql.shuffle.partitions", "1") .getOrCreate();
之后再执行原写入代码即可。但这个设置会影响作业中所有需要shuffle的操作,除非必要不建议使用。
注意:合并成单个文件后,输出的文件名会是类似
part-00000-xxxxxx-c000.txt的格式,Spark本身不支持直接指定输出文件名,若需要固定名称,可在写入完成后手动重命名文件。
内容的提问来源于stack exchange,提问作者patrick pascoal ribeiro
相关产品推荐
相关产品推荐

