如何使用 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 名称。计数器的名称与输出名称相同。这些计算写入每个输出名称的记录数。

也看看

这是我们在 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