来自Mapper的不受欢迎的输出

时间:2015-03-04 06:03:59

标签: java hadoop mapreduce

我试图一起处理四行数据集。我在mapper中使用了变量 lineCount 。但是我没有正确地获得部分输出。

这是我的mapper类: -

public class GC_Mapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    int lineCount = 0;

    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        if (lineCount % 4 == 0) {
            context.write(new Text("#Reads"), new IntWritable(1));
            lineCount++;
            return;
        }

        if (lineCount % 4 == 1) {
            context.write(new Text("X"), new IntWritable(1));               
            lineCount++;
            return;
        }

        if (lineCount % 4 == 2) {
            context.write(new Text("Y"), new IntWritable(1));
            lineCount++;
            return;
        }

        if (lineCount % 4 == 3) {
            context.write(new Text("Z"), new IntWritable(1));
            lineCount++;
            return;
        }
    }
}

我的减速机: -

public class GC_Reducer extends
        Reducer<Text, IntWritable, Text, DoubleWritable> {
    int numReads;

    public void reduce(Text key, Iterable<IntWritable> values, Context context)
            throws IOException, InterruptedException {
        if ((key.toString()).startsWith("#")) {
            for (IntWritable read : values) {
                numReads += read.get();
            }
            context.write(key, new DoubleWritable(numReads));
        }

        if ((key.toString().startsWith("X"))) {
            double sum1 = 0;
            for (IntWritable val : values) {
                sum1 += val.get();
            }
            context.write(key, new DoubleWritable(sum1));
        }

        if ((key.toString().startsWith("Y"))) {
            double sum2 = 0;
            for (IntWritable val : values) {
                sum2 += val.get();
            }
            context.write(key, new DoubleWritable(sum2));
        }

        if ((key.toString().startsWith("Z"))) {
            double sum3 = 0;
            for (IntWritable val : values) {
                sum3 += val.get();
            }
            context.write(key, new DoubleWritable(sum3));
        }
    }
}

我的目的是获取读数(提供4行作为单个记录)并以不同方式处理四行。 但面临的问题是我得到了输出: -

#Reads 50.0
X      100.0
Y      100.0
Z      100.0  

但我所需的输出为所有键的50.0。只有#Reads值是正确的。请帮我找一个解决方案。提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果您的所有数据都采用4行记录格式,那么使用FileInputFormat以及RecordReader听起来会更好。您只需将4行文本文件一起发送到映射器,而不是逐行发送。

看一下关于在hadoop中阅读pdf的问题的this回答。您的主要工作将依赖于nextKeyValue扩展课程的RecordReader功能。

答案 1 :(得分:0)

我自己得到了答案。实际上,这是我的错误。我的映射器输出值是 IntWritable 。我试图将它分配给一个double变量,并尝试在reducer中将该值写为 DoubleWritable 。谢谢大家!