用于减速器功能的一个键的多个输出,Hadoop

时间:2014-04-20 17:38:16

标签: java hadoop mapreduce reduce

我需要做什么并且遇到一些麻烦就是为一个键输出两个值作为reduce函数的输出。 reduce函数以Id的形式和与该Id相关联的整数列表接收数据。它需要输出Id,列表中整数的平均值和列表的长度。

但是,reduce函数的实现应该以{{1​​}}为参数,明确地将与每个键关联的输出数量限制为1。

非常感谢这方面的任何帮助。提前谢谢。

Hadoop版本:2.0.0

2 个答案:

答案 0 :(得分:1)

您必须使用MultipleOutputs。在工作中:

MultipleOutputs.addMultiNamedOutput(job,
            "Name",
            SequenceFileOutputFormat.class, Text.class,
            Writable.class);

在减速器中:

multipleOutputs.getCollector

答案 1 :(得分:-1)

以下是您模糊问题的几个答案。

如果您不介意在混合输出中出现在其自己的记录中的每个数据(长度和平均值),您可以根据需要多次调用collect()。这可以通过不同地编写密钥以区分不同的记录类型来实现,如下所示:

oc.collect( new Text( k.toString() + " mean", mean );
oc.collect( new Text( k.toString() + " length", length );

OR

您应该选择不同的值类型V3而不是IntWritable。创建PairOfIntWritable或使用ArrayWritable将您想要的内容推送到collect的单个调用中。然后,长度和平均值可以是每个键的单个记录的值的“字段”。

OR

如果您必须使用IntWritable,请使用invertible pairing function将两个整数合并为一个整数。您需要确保不能超过IntWritable的最大值,并且可以从输入数据生成任何可能的对。

OR

使用MultipleOutputs将每条记录发送到一个按名称区分的不同文件,因此part-r-nnnnn包含means和length-r-nnnnn包含长度。 MultipleOutputs上的JavaDoc解释了它的用法。