一、map函数
//record表示输入表的每一行记录
public void map(long recordNum, Record record, TaskContext context) throws IOException {
for (int i = 0; i < record.getColumnCount(); i++) {//遍历每一列
String[] words = record.get(i).toString().split("\\s+");
for (String w : words) {
word.set(new Object[] {w});
context.write(word, one);
}
}
}
参数:
1、recordNum表示: 当前输入是第几行记录?
2、record表示:表格的每一行记录。在map函数中,record代表读入的一行数据,可以通通过record.get(n)方法获取该行记录第n列的数据。并且方便的是,这里可以直接对读入的数据进行一个类型转换。例如record.getString()会把读入的数据转为字串,record.getBigInt()则会把读入的数据转为Long型整数。
3、context:每调用一次write函数,就会输出一行记录。context.write(key,value)的意思是输出这条key-value,如果不写这行,Mapper就什么都不输出。一个Mapper可以有0个或多个key-value的输出,每调用一次context.write(key,value)就会输出一行。
二、reduce函数
//输入map阶段每个key,以及每个key对应的多个values
public void reduce(Record key, Iterator<Record> values, TaskContext context) throws IOException {
long count = 0;
while (values.hasNext()) {
Record val = values.next();
count += (Long) val.get(0);
}
result.set(0, key.get(0));//设置第一列为key
result.set(1, count);//设置第二列为count
context.write(result);//添加本条记录
}
参数:
1、key:对应到map阶段输出每个key;
2、values参数:是一个Iterator,通过调用values.next()来读取所有属于该key的记录。每读取一行记录,可进行相应操作;
3、输出context:Reducer的output是一个Record类,可以通过output.set(n)来设定该output第n列的数值,同样使用context.write(output)输出一行记录。
参考资料:
https://www.zybuluo.com/chanvee/note/11984