与map端的模式类似,map端要重写Mapper方法,reduce端也要重写Reduce方法,这里有一个泛型,我们先看参数类型

分别对应输入keyin,valuein,keyout,valueout.。

  这里前两个参数:keyin,valueint就是map端处理以后的键值对。map端的逻辑我们已经写完了,在那个阶段,我们设置了以手机号为key,一个bean对象为value的键值对。但是map端还有其他的处理逻辑,设置完键值对以后,map还要把相同key的数据放在一起,打上分区标志(如果有分区的话),然后把相同分区的数据分发(shuffle)一个reduce里面。比如我们的原始数据有这么两个手机号:

13726230503112 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 24681 200

13726230503112 5C-0E-8B-C7-F7-90:CMCC 120.197.40.4 rank.ie.sogou.com 搜索引擎 28 27 3659 3538 200,

  map端处理完以后,分发到reduce的数据格式是这样一个map集合:

map(

key:13726230503112

value{

  phoneNumber:13726230503112 ,upFlow:2481  downFlow:24681 ,sumFlow:27162

  phoneNumber:13726230503112 ,upFlow:3659 downFlow:3538 ,sumFlow:7179

}

)

reduce代码:

package MR.phone;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class FlowReduce extends Reducer<Text,PhoneBean,Text,PhoneBean> {
@Override
protected void reduce(Text key, Iterable<PhoneBean> values, Reducer<Text, PhoneBean, Text, PhoneBean>.Context context) throws IOException, InterruptedException {
//遍历所有的PnoneBean,将其上下行流量进行累加计算,计算完之后封装数据,写出
long sum_upflow=0;
long sum_downflow=0;
long sum_flow=0;
for (PhoneBean flow : values) {
sum_upflow=sum_upflow+flow.getUpFlow();
sum_downflow=sum_downflow+ flow.getDownFlow();
sum_flow=sum_flow+flow.getSumFlow();
}
//封装数据,写出
PhoneBean result_flow=new PhoneBean(sum_upflow,sum_downflow,sum_flow);
context.write(key,result_flow);

}
}

这里的代码逻辑计较简单,注意我们这里封装valueout的时候,用的有参构造, 注意bean里面要有有参构造。但是整个一个map——shuffl——reduce过程基本就是这样了。现在回过头看map-reduce的流程图,会清晰很多。

现在剩下的问题就是搞个Driver(固定套路),测试一下我们的代码逻辑:

package MR.phone;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

public class FlowDriver {
public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
//1,获取配置信息,设置job
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);

//设置job
job.setJarByClass(FlowDriver.class);

//设置map
job.setMapperClass(FlowMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(PhoneBean.class);

//设置reduce
job.setReducerClass(FlowReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(PhoneBean.class);

//设置路径
FileInputFormat.setInputPaths(job,new Path("D:\\bigadatapra\\phone_data.txt"));
FileOutputFormat.setOutputPath(job,new Path("D:\\bigadatapra\\output041801"));

//提交job
boolean result = job.waitForCompletion(true);

System.exit(result?0:1);

}

}

如果配置好本地Hadoop环境的话,直接运行main函数就能看见结果了。



reduce累加实现的更多相关文章

  1. python 练习用python六剑客实现一个统计数字的个数,六剑客:(map、lambda、reduce、filter、切片、推到列表)

    统计一共有几个数字 s="sdfa45ads46723" #lambda >>> filter(lambda x:x.isdigit(),list(s)) ['4 ...

  2. 第七十九篇:数组方法(forEach,some,every,reduce)

    好家伙,来复习几个数组方法, 1.forEach循环与some循环 代码如下: <script> const arr =['奔驰','宝马','GTR','奥迪'] //forEach循环 ...

  3. python test

    #!/usr/bin/env python #-*- encoding: utf- -*- ''' def foo(name): print name, '去砍柴' foo('yangshanlei: ...

  4. Python序列函数、高级特性及高阶函数

    序列函数: enumerate: for循环时记录索引,逐个返回元组(i, item) sorted:返回新的有序列表 zip:压缩将多个序列的对应位置的元素组成元组 zip(*元组列表): 解压缩 ...

  5. 使用javascript模拟常见数据结构(一)

    数据结构和算法可算是每个程序员的必备技能,而随着前端工作的深入,对于数据结构的知识真的是越来越需要掌握了.好了,于是乎最近看了<javascript数据结构和算法>,算是对于后面的使用C语 ...

  6. simrank

    simrank 背景 度量相似度是许多应用的关键问题.传统方法与问题的领域相关,如文本匹配.计算交集.simrank则利用关联关系度量相似性,即"两个节点的相似性和各自邻域节点的相似度有关& ...

  7. ES5拓展

    一.JSON拓展 1.JSON.parse(str,fun):将JSON字符串转为js对象 两个参数:str表示要处理的字符串:fun处理函数,函数有两个参数,属性名.属性值 // 定义json字符串 ...

  8. numpy_basic3

    矩陣 矩阵是numpy.matrix类类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算.求逆 ...

  9. js数组的遍历(API)

    1.for 循环 普通遍历方法,可优化,存下数组的length,避免每次都去获取数组的length,性能提升 for(var i=0;i<arr.length;i++){ console.log ...

随机推荐

  1. 力扣算法:LC 704-二分查找,LC 27-移除元素--js

    LC 704-二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 ...

  2. 使用VLL技术实现多家合作伙伴复用同一条链路做两端数据全透传

    公司A当前租用一条10G跨市运营商光缆,自身业务只用到一半流量,为节省成本,寻求多家合作伙伴共用链路以达到财务需求 合作伙伴需求接入链路全透传,即光缆两端接入点端口逻辑直连 当前有三种方案可以实现上述 ...

  3. Java实现数据库增删改查

    代码示例: import java.sql.*; public class Renewal { // 创建类static Connection con; // 声明Connection对象static ...

  4. CF1665A GCD vs LCM

  5. 用一个性能提升了666倍的小案例说明在TiDB中正确使用索引的重要性

    背景 最近在给一个物流系统做TiDB POC测试,这个系统是基于MySQL开发的,本次投入测试的业务数据大概10个库约900张表,最大单表6千多万行. 这个规模不算大,测试数据以及库表结构是用Dump ...

  6. .NET C#基础(6):命名空间 - 有名字的作用域

    0. 文章目的   面向C#新学者,介绍命名空间(namespace)的概念以及C#中的命名空间的相关内容. 1. 阅读基础   理解C与C#语言的基础语法.   理解作用域概念. 2. 名称冲突与命 ...

  7. 使用 DartPad 制作代码实践教程

    DartPad 是一个开源的.在浏览器中体验和运行 Dart 编程语言的线上编辑器,目标是为了帮助开发者更好地了解 Dart 编程语言以及 Flutter 应用开发. DartPad 项目起始于 20 ...

  8. JS:条件语句2

    1.for循环:循环代码块一定的次数 例: for(var i = 0;i<5;i++){ console.log(i); } // 0 1 2 3 4 遍历对象: var arr=[" ...

  9. 探索链路追踪在.NET6工业物联网项目的应用

    ExploringIoTDistributedTracingNet6 如果觉得有用,请留言学到了. 已经会了的老哥,请留言就这? 可能遇到的问题 工业物联网项目自上而下一般分为ERP.Mes.SCAD ...

  10. 简述电动汽车的发展前景及3D个性化定制需求

    李彦宏前几天又搞事,他宣布百度要开始造电动汽车了!百度市值更是因此一夜暴涨了700亿. 这熟悉的配方,好像在乔布斯.库克那里也见过. 苹果的"iCar"(或者是Apple Car) ...