如何确定减速机的重要值?

时间:2016-10-13 12:44:00

标签: java hadoop mapreduce

运行地图后我得到了

键,值
1,白天,夜晚,白天
2,日,天

将此值传递给reducer。 我的减速机

import org.apache.hadoop.mapred.Reducer;

public class RTransactionPerPartOfDay implements Reducer<Text, Text, Text, IntWritable>{
    public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, IntWritable> outputCollector, Reporter reporter) throws IOException {
        IntWritable intWritable = new IntWritable();
        int transactionPerPartOfDayCount = 0;
        while(values.hasNext()){
            transactionPerPartOfDayCount += 1;
            values.next();
        }
        intWritable.set(transactionPerPartOfDayCount);
        outputCollector.collect(key, intWritable);
    }

给出以下输出

1,3
2,2

这意味着,我们遇到密钥1 3次,密钥2 2次。根据我们遇到值的次数,我需要做什么才能使reducer count键分离?

像这样

1,1
1,2
2,2

2 个答案:

答案 0 :(得分:0)

解决方案#1

在地图输出中,将值作为键的一部分:

1 day, null
1 night, null
1 day, null
2 day, null
2 day, null

然后将其拆分为reduce:

public class RTransactionPerPartOfDay implements Reducer<Text, NulLWritable, Text, IntWritable>{
    public void reduce(Text key, Iterator<NullWritable> values, OutputCollector<Text, IntWritable> outputCollector, Reporter reporter) throws IOException {
        String[] keyParts = key.toString().split(" ");
        int count = 0;
        for (NullWritable aValue : values) count++;
        outputCollector.collect(new Text(keyParts[0]), new IntWritable(count));
    }

解决方案#2

如果符合内存限制,请使用hashmap计算reduce。

答案 1 :(得分:0)

你在reducer中的键值是1和2,当键是1时,值是{1,2},当键是2时,值是{2},所以尝试这样的事情:

while(values.hasNext()){
      transactionPerPartOfDayCount += Integer.parseInt(values.next());
}