如何使用spark将avro写入多个输出目录

时间:2016-11-25 04:59:33

标签: apache-spark avro spark-avro

嗨,有一个主题是使用MultipleTextOutputFormat在一个spark作业中将文本数据写入多个输出目录

Write to multiple outputs by key Spark - one Spark job

我会问是否有类似的方法将avro数据写入多个目录

我想要的是将avro文件中的数据写入不同的目录(基于时间戳字段,时间戳中的同一天转到同一目录)

2 个答案:

答案 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