我能够成功更改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
我需要我的地图缩小以执行类似下面的操作。
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是浮点数的和,字符串是两个字符串的串联。
答案 0 :(得分: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
。
我没有尝试编译这个,但总的想法就在那里。