每次过一段时间就会忘记 MapReduce 的代码编写步骤 ,所以记录一下,方便以后翻看
现有一个案例:
现在有一堆关于手机号的数据,需要从中获取每个手机号对应的上行流量,下行流量,以及总流量(总流量=上行流量+下行流量)
原数据类型大概如下:
这里把手机号为Key,其他(上行,下行,总流量)为value,因为value不只是一个参数,所以需要自定义一个Bean对象,用来传value
具体的自定义Bean对象的相关代码在这篇文章里写了:
自定义Bean对象(还是这个手机号流量案例为主)
下面是对应Mapper阶段代码:(具体的导入的包没写)
public class FlowCountMapper extends Mapper<LongWritable,Text,Text,FlowBean>{
Text k=new Text();
FlowBean v=new FlowBean();
//重写map方法
protected void map(LongWritable key , Text value ,Context context)throws IOException{
// 1. 获取一行
String line = value.toString();//(把序列化转换成String类型,为了方便切割)
// 2.切割 \t
String[] word=line.split("\t");
// 3.封装对象
//Text k=new Text(); 在这里创建对象的话,每循环就创建一个对象
//FlowBean v=new FlowBean(); 所以把创建对象的语句放在方法外面
k.set(word[1]);//封装手机号
long upFlow=Long.parseLong(word[word.length-3]);//倒数第三列,上行流量
//因为upFlow是long类型,但截取的word是string 类型,所以需要类型转换
long downFlow=Long.parseLong(word[word.length-2]);//倒数第二列,下行流量
v.setUpFlow(upFlow); //把上行流量值传进去
v.setDownFlow(downFlow);//把下行流量传进去
// 4.写出
context.write(k,v); //这里的v就是自定义的Bean对象
Mapper阶段编写共分四大步骤:
- 获取一行
- 切割
- 封装对象(就是New出key和value的对象,然后就是k.set( ) ,v.set( ) )
- 写出(提交到缓冲区)