我需要做的是做一些麻烦,就是为一个键输出两个值作为reduce函数的输出 . reduce函数以Id的形式和与该Id相关联的整数列表接收数据 . 它需要输出Id,列表中整数的平均值和列表的长度 .
但是,reduce函数的实现应该具有 OutputCollector <Text, IntWritable> 作为参数,该参数明确地将与每个键相关联的输出的数量限制为1 .
OutputCollector <Text, IntWritable>
在这方面的任何帮助将不胜感激 . 提前致谢 .
Hadoop版本:2.0.0
您必须使用MultipleOutputs . 在工作:
MultipleOutputs.addMultiNamedOutput(job, "Name", SequenceFileOutputFormat.class, Text.class, Writable.class);
在减速机中:
multipleOutputs.getCollector
以下是您模糊问题的一些答案 .
如果您不介意在混合输出中出现在其自己的记录中的每个数据(长度和平均值),您可以根据需要多次调用 collect() . 这可以通过不同地编写密钥以区分不同的记录类型来实现,如下所示:
collect()
oc.collect( new Text( k.toString() + " mean", mean ); oc.collect( new Text( k.toString() + " length", length );
要么
您应该选择不同的值类型V3而不是 IntWritable . 创建 PairOfIntWritable 或使用 ArrayWritable 将任何想要的内容推送到 collect 的单个调用中 . 那么长度和平均值可以是每个键的单个记录的值的"fields" .
IntWritable
PairOfIntWritable
ArrayWritable
collect
如果您必须使用 IntWritable ,请使用invertible pairing function将两个整数合并为一个整数 . 您'll need to insure that you can' t超过 IntWritable 的最大值,您可以从输入数据中生成任何可能的对 .
使用 MultipleOutputs 将每个记录发送到一个按名称区分的不同文件,因此part-r-nnnnn包含means和length-r-nnnnn包含长度 . MultipleOutputs 上的JavaDoc解释了它的用法 .
MultipleOutputs
2 回答
您必须使用MultipleOutputs . 在工作:
在减速机中:
以下是您模糊问题的一些答案 .
如果您不介意在混合输出中出现在其自己的记录中的每个数据(长度和平均值),您可以根据需要多次调用
collect()
. 这可以通过不同地编写密钥以区分不同的记录类型来实现,如下所示:要么
您应该选择不同的值类型V3而不是
IntWritable
. 创建PairOfIntWritable
或使用ArrayWritable
将任何想要的内容推送到collect
的单个调用中 . 那么长度和平均值可以是每个键的单个记录的值的"fields" .要么
如果您必须使用
IntWritable
,请使用invertible pairing function将两个整数合并为一个整数 . 您'll need to insure that you can' t超过IntWritable
的最大值,您可以从输入数据中生成任何可能的对 .要么
使用
MultipleOutputs
将每个记录发送到一个按名称区分的不同文件,因此part-r-nnnnn包含means和length-r-nnnnn包含长度 .MultipleOutputs
上的JavaDoc解释了它的用法 .