我需要做什么并且遇到一些麻烦就是为一个键输出两个值作为reduce函数的输出。 reduce函数以Id的形式和与该Id相关联的整数列表接收数据。它需要输出Id,列表中整数的平均值和列表的长度。
但是,reduce函数的实现应该以{{1}}为参数,明确地将与每个键关联的输出数量限制为1。
非常感谢这方面的任何帮助。提前谢谢。
Hadoop版本:2.0.0
答案 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解释了它的用法。