**分析**:以需求一的输出结果作为排序的输入数据,自定义FlowBeanSort,以 FlowBeanSort 为 Map 输出的 key,以手机号作为 Map 输出的 value,因为 MapReduce 程序会对 Map 阶段输出 的key 进行排序。具体实现如下所示:
// 输入数据是上一个统计程序的输出结果,已经是各个手机号的总流量信息publicclassFlowSumSortMapperextendsMapper<LongWritable, Text, FlowBeanSort, Text> { protectedvoidmap(LongWritablekey, Textvalue, Mapper<LongWritable, Text, FlowBeanSort, Text>.Contextcontext) throwsIOException, InterruptedException { // (1)获取一行文本的内容,并将其转换为String类型,之后按照分隔符“\t”进行切分String[] splits=value.toString().split("\t"); // (2)取出手机号Stringtelephone=splits[0]; // (3)封装对象FlowBeanSortfbs=newFlowBeanSort(); fbs.setUpFlow(Long.parseLong(splits[1])); fbs.setDownFlow(Long.parseLong(splits[2])); fbs.setSumFlow(Long.parseLong(splits[3])); // (4)将封装的fbs对象作为key,将手机号作为value,分发给Reduce端context.write(fbs, newText(telephone)); } }
- **KEYIN**:是指框架读取到的数据的key的类型,在默认的InputFormat下,读到的key是一行文本的起始偏移量,所以key的类型是Long,对应 Hadoop 中的 LongWritable
- **VALUEIN**:是指框架读取到的数据的value的类型,在默认的InputFormat下,读到的value是一行文本的内容,所以value的类型是String,对应 Hadoop 中的 Text
- **KEYOUT**:用户自定义逻辑方法返回数据中key的类型,由用户业务逻辑决定,在此程序中,我们输出的key是封装并实现了自定义排序的流量信息类 FlowBeanSort
- **VALUEOUT**:用户自定义逻辑方法返回数据中value的类型,由用户业务逻辑决定,在此程序中,我们输出的 value 是手机号,所以是String,对应 Hadoop 中的 Text