**分析**:这里的 `reduce()`方法只需要实现将 Map 端输出的 key-value 调换后输出即可。
publicclassFlowSumSortReducerextendsReducer<FlowBeanSort, Text, Text, FlowBeanSort> { /** <FlowBeanSort,电话号> ===> <电话号,FlowBeanSort>*/protectedvoidreduce(FlowBeanSortkey, Iterable<Text>values, Reducer<FlowBeanSort, Text, Text, FlowBeanSort>.Contextcontext) throwsIOException, InterruptedException { // 遍历集合for (Texttele : values) { // 将手机号作为key,将封装好的流量信息作为value,作为最终的输出结果context.write(newText(tele), key); } } }
- **KEYIN**:对应 Mapper 端输出的 KEYOUT,即封装的流量信息类 FlowBeanSort
- **VALUEIN**:对应 Mapper 端输出的 VALUEOUT,即手机号,所以是 String,对应 Hadoop 中的 Text
- **KEYOUT**:用户自定义逻辑方法返回数据中key的类型,由用户业务逻辑决定,在此程序中,我们输出的key是手机号,所以是String,对应 Hadoop 中的 Text
- **VALUEOUT**:用户自定义逻辑方法返回数据中value的类型,由用户业务逻辑决定,在此程序中,我们输出的value是封装好的实现了自定义排序的流量信息类,所以是 FlowBeanSort