2014-04-20 58 views
1

我需要做什么,我有一些麻烦做的是有一个键输出的两个值作为我的减少功能的输出。 reduce函数以Id和与该Id相关联的整数列表的形式接收数据。它需要输出该Id,列表中整数的平均值和列表的长度。多个输出为一个键为减速功能,Hadoop

然而,减少函数的实现应该具有OutputCollector <Text, IntWritable>作为显然限制的与每个键相关联的输出的数目为1。

在这方面的任何帮助,将不胜感激的参数。提前致谢。

Hadoop版本:2.0.0

+0

你的问题措辞太差,以至于你迄今收到的两个答案都不被认为是错误的,但它们完全不同。我可以想到第三种解释导致另一个答案。 –

回答

1

您必须使用MultipleOutputs。在作业:

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

在减速:

multipleOutputs.getCollector 
-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到每一个记录发送到通过名称来区分不同的文件,所以部分-R-NNNNN含有手段和长度-R-NNNNN包含长度,例如。关于MultipleOutputs的JavaDoc解释了它的用法。

相关问题