在spark流中更改输出文件名

r1zhe5dt  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(258)

我正在运行一个Spark的工作,执行非常好的逻辑去。但是,当我使用saveastextfile将文件保存在s3 bucket中时,输出文件的名称的格式是part-00000、part-00001等。有没有办法更改输出文件名?
谢谢您。

wfypjpf4

wfypjpf41#

[java解决方案]
假设你有:

JavaRDD<Text> rows;

你想把它写进像 customPrefix-r-00000 .

Configuration hadoopConf = new Configuration();
hadoopConf.set("mapreduce.output.basename", "customPrefix");

rows.mapToPair(row -> new Tuple2(null, row)).saveAsNewAPIHadoopFile(outputPath, NullWritable.class, Text.class, TextOutputFormat.class, hadoopConf);

塔达!!

pengsaosao

pengsaosao2#

在spark中,可以使用saveasnewapihadoopfile并在hadoop配置中设置mapreduce.output.basename参数来更改前缀(只是“part”前缀)

val hadoopConf = new Configuration()
hadoopConf.set("mapreduce.output.basename", "yourPrefix")

yourRDD.map(str => (null, str))
        .saveAsNewAPIHadoopFile(s"$outputPath/$dirName", classOf[NullWritable], classOf[String],
          classOf[TextOutputFormat[NullWritable, String]], hadoopConf)

您的文件将命名为:yourprefix-r-00001
在hadoop和spark中,输出中可以有多个文件,因为可以有多个reducer(hadoop)或多个分区(spark)。然后您需要保证每个文件名都是唯一的,这就是为什么不可能覆盖文件名最后一部分的序列号的原因。
但是,如果您想对文件名有更多的控制,可以扩展textoutputformat或fileoutputformat并重写getuniquefile方法。

相关问题