如何使用 spark 将 avro 写入多个输出目录
How to write avro to multiple output directory using spark
你好,有一个主题是使用MultipleTextOutputFormat在一个spark作业中将文本数据写入多个输出目录
Write to multiple outputs by key Spark - one Spark job
请问是否有类似的方法可以将avro数据写入多个目录
我想要的是将avro文件中的数据写入不同的目录(根据时间戳字段,时间戳中的同一天去同一目录)
AvroMultipleOutputs class 简化了将 Avro 输出数据写入多个输出。
情况一:写入作业默认输出以外的其他输出。每个额外的输出,或命名的输出,都可以配置有自己的模式和输出格式。
案例二:将数据写入用户提供的不同文件
AvroMultipleOutputs
支持计数器,默认情况下它们是禁用的。计数器组是 AvroMultipleOutputs
class 名称。计数器的名称与输出名称相同。这些计算写入每个输出名称的记录数。
也看看
- MultipleOutputer
- MultipleOutputsFormatTest (see the code example with unit test case here... For some reason MultipleOutputs does not work with Avro, but the near-identical AvroMultipleOutputs does. These obviously related classes have no common ancestor so they are combined under the MultipleOutputer type class which at least allows for future extension.)
这是我们在 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 returns一个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
你好,有一个主题是使用MultipleTextOutputFormat在一个spark作业中将文本数据写入多个输出目录
Write to multiple outputs by key Spark - one Spark job
请问是否有类似的方法可以将avro数据写入多个目录
我想要的是将avro文件中的数据写入不同的目录(根据时间戳字段,时间戳中的同一天去同一目录)
AvroMultipleOutputs class 简化了将 Avro 输出数据写入多个输出。
情况一:写入作业默认输出以外的其他输出。每个额外的输出,或命名的输出,都可以配置有自己的模式和输出格式。
案例二:将数据写入用户提供的不同文件
AvroMultipleOutputs
支持计数器,默认情况下它们是禁用的。计数器组是 AvroMultipleOutputs
class 名称。计数器的名称与输出名称相同。这些计算写入每个输出名称的记录数。
也看看
- MultipleOutputer
- MultipleOutputsFormatTest (see the code example with unit test case here... For some reason MultipleOutputs does not work with Avro, but the near-identical AvroMultipleOutputs does. These obviously related classes have no common ancestor so they are combined under the MultipleOutputer type class which at least allows for future extension.)
这是我们在 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 returns一个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