你好,有一个题目是关于在一个spark job中使用MultipleTextOutputFormat将文本数据写入多个输出目录
通过键 Spark 写入多个输出 - 一项 Spark 作业
我会问是否有一些类似的方法可以将 avro 数据写入多个目录
我想要的是将avro文件中的数据写入不同的目录(基于时间戳字段,时间戳中的同一天进入同一目录)
你好,有一个题目是关于在一个spark job中使用MultipleTextOutputFormat将文本数据写入多个输出目录
通过键 Spark 写入多个输出 - 一项 Spark 作业
我会问是否有一些类似的方法可以将 avro 数据写入多个目录
我想要的是将avro文件中的数据写入不同的目录(基于时间戳字段,时间戳中的同一天进入同一目录)
AvroMultipleOutputs类简化了将 Avro 输出数据写入多个输出的过程。
案例一:写入作业默认输出以外的其他输出。每个附加输出或命名输出都可以配置有自己的模式和输出格式。
案例二:向用户提供的不同文件写入数据
AvroMultipleOutputs
支持计数器,默认情况下它们被禁用。计数器组是AvroMultipleOutputs
类名。计数器的名称与输出名称相同。这些计算写入每个输出名称的记录数。
也看看
以下是我们在 java 中为我们的用例实现的内容:使用 AvroMultipleOutputs 根据 avro 记录的内容写入带有前缀的不同文件。
这是 OutputFormat 之上的包装器,用于使用 AvroMultipleOutputs 产生多个输出,类似于@Ram 提到的。https://github.com/architch/MultipleAvroOutputsFormat/blob/master/MultipleAvroOutputsFormat.java
它可用于将 avro 记录写入 spark 中的多个路径,方式如下:
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 来完全写入不同的目录,如下所述:写入多个目录