Hadoop的MapReduce中,map函数和reduce函数遵循如下常规格式:
map(k1,v1)------->list(k2,v2)
reduce(k2,list(v2))------->list(k3,v3)
一般来说,map函数的键值类型(k1和v1)不同于输出类型(k2和v2)。然而reduce函数的输入类型必须和map函数的输出类型相同。但是reduce函数的输出类型(k3和v3)可以不同于输入类型。
Map函数
public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
public abstract class Context
implements MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
}
protected void map(KEYIN key, VALUEIN value,
Context context) throws IOException, InterruptedException {
context.write((KEYOUT) key, (VALUEOUT) value);
}
}
Reduce函数
public class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
public abstract class Context
implements ReduceContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
}
protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
) throws IOException, InterruptedException {
for(VALUEIN value: values) {
context.write((KEYOUT) key, (VALUEOUT) value);
}
}
}
当我们在写MapReduce时,我们需要写一个类实现Map函数和Reduce函数,重写map方法和reduce方法
在Map类和Reduce类中,Context类对象用于输出键值对,因此他们通过输出类型参数化