嗨,有一个主题是使用MultipleTextOutputFormat在一个spark作业中将文本数据写入多个输出目录
Write to multiple outputs by key Spark - one Spark job
我会问是否有类似的方法将avro数据写入多个目录
我想要的是将avro文件中的数据写入不同的目录(基于时间戳字段,时间戳中的同一天转到同一目录)
答案 0 :(得分:2)
AvroMultipleOutputs类简化了将Avro输出数据写入多个输出的过程。
案例一:写入除作业默认输出以外的其他输出。每个附加输出或命名输出可以配置自己的Schema和OutputFormat。
案例二:将数据写入用户提供的不同文件
AvroMultipleOutputs
支持计数器,默认情况下它们被禁用。计数器组是AvroMultipleOutputs
类名。计数器的名称与输出名称相同。这些计算写入每个输出名称的记录数。
另外看看
答案 1 :(得分:0)
这是我们在java中为用例实现的内容:使用AvroMultipleOutputs根据avro记录的内容写入带有前缀的不同文件。
这里是OutputFormat的包装器,它使用类似于@Ram提到的AvroMultipleOutputs产生多个输出。 https://github.com/architch/MultipleAvroOutputsFormat/blob/master/MultipleAvroOutputsFormat.java
它可用于以以下方式通过火花将avro记录写入多个路径:
Job job = Job.getInstance(hadoopConf);
AvroJob.setOutputKeySchema(job, schema);
AvroMultipleOutputs.addNamedOutput(job,"type1",AvroKeyOutputFormat.class,schema);
AvroMultipleOutputs.addNamedOutput(job,"type2",AvroKeyOutputFormat.class,schema);
rdd.mapToPair(event->{
if(event.isType1())
return new Tuple2<>(new Tuple2<>("type1",new AvroKey<>(event.getRecord())),NullWritable.get());
else
return new Tuple2<>(new Tuple2<>("type2",new AvroKey<>(event.getRecord())),NullWritable.get());
})
.saveAsNewAPIHadoopFile(
outputBasePath,
GenericData.Record.class,
NullWritable.class,
MultipleAvroOutputsFormat.class,
job.getConfiguration()
);
此处getRecords返回GenericRecord。 输出在outputBasePath上是这样的:
17359 May 28 15:23 type1-r-00000.avro
28029 May 28 15:24 type1-r-00001.avro
16473 May 28 15:24 type1-r-00003.avro
17124 May 28 15:23 type2-r-00000.avro
30962 May 28 15:24 type2-r-00001.avro
16229 May 28 15:24 type2-r-00003.avro
也可以通过直接提供baseOutputPath来完全写入不同的目录,如此处所述:write to multiple directory