5

你好,有一个题目是关于在一个spark job中使用MultipleTextOutputFormat将文本数据写入多个输出目录

通过键 Spark 写入多个输出 - 一项 Spark 作业

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

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

4

2 回答 2

2

AvroMultipleOutputs类简化了将 Avro 输出数据写入多个输出的过程。

  • 案例一:写入作业默认输出以外的其他输出。每个附加输出或命名输出都可以配置有自己的模式和输出格式。

  • 案例二:向用户提供的不同文件写入数据

AvroMultipleOutputs支持计数器,默认情况下它们被禁用。计数器组是AvroMultipleOutputs类名。计数器的名称与输出名称相同。这些计算写入每个输出名称的记录数。

也看看

于 2016-11-25T06:38:01.850 回答
0

以下是我们在 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 来完全写入不同的目录,如下所述:写入多个目录

于 2020-05-28T13:23:20.343 回答