5

我能够成功地更改 hadoop 中的wordcount程序以满足我的要求。但是,我还有另一种情况,我对 3 个值使用相同的键。假设我的输入文件如下。

A Uppercase 1 firstnumber  I  romannumber a lowercase
B Uppercase 2 secondnumber II romannumber b lowercase

目前在我的 map/reduce 程序中,我正在做类似下面的事情。这里 A 是键,1 是值。

A 1

我需要我的 map reduce 来执行类似下面的操作。

A 1 I a 

我可以在下面的 3 个不同程序中执行它们,并且可以产生输出。

A 1
A I
A a

但是,我希望他们在一个程序本身中完成。基本上,从我的地图功能我想这样做。

context.write(key,value1);
context.write(key,value2);
context.write(key,value3);

有什么办法可以在同一个程序中完成,而不是编写三个不同的程序?

编辑:

让我提供一个更清楚的例子。我需要做类似下面的事情。

A uppercase 1 firstnumber  1.0 floatnumber str stringchecking
A uppercase 2 secondnumber 2.0 floatnumber ing stringchecking

我的最终输出是,

A 3 3.0 string

3 是两个整数之和,3.0 是浮点数之和,字符串是两个字符串的串联。

4

1 回答 1

15

首先,您需要一个可写入所有三个值的组合。

public class CompositeWritable implements Writable {
    int val1 = 0;
    float val2 = 0;
    String val3 = "";

    public CompositeWritable() {}

    public CompositeWritable(int val1, float val2, String val3) {
        this.val1 = val1;
        this.val2 = val2;
        this.val3 = val3;
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        val1 = in.readInt();
        val2 = in.readFloat();
        val3 = WritableUtils.readString(in);
    }

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeInt(val1);
        out.writeFloat(val2);
        WritableUtils.writeString(out, val3);
    }

    public void merge(CompositeWritable other) {
        this.val1 += other.val1;
        this.val2 += other.val2;
        this.val3 += other.val3;
    }

    @Override
    public String toString() {
        return this.val1 + "\t" + this.val2 + "\t" + this.val3;
    }
}

然后在你的减少你会做这样的事情......

public void reduce(Text key, Iterable<CompositeWritable> values, Context ctx) throws IOException, InterruptedException{

    CompositeWritable out;

    for (CompositeWritable next : values)
    {
        out.merge(next);
    }

    ctx.write(key, out);
}

CompositeWritable您的映射器将简单地为每张地图输出一个。

我还没有尝试编译这个,但一般的想法是存在的。

于 2013-06-20T16:46:25.560 回答