reduce累加实现
与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累加实现的更多相关文章
- python 练习用python六剑客实现一个统计数字的个数,六剑客:(map、lambda、reduce、filter、切片、推到列表)
统计一共有几个数字 s="sdfa45ads46723" #lambda >>> filter(lambda x:x.isdigit(),list(s)) ['4 ...
- 第七十九篇:数组方法(forEach,some,every,reduce)
好家伙,来复习几个数组方法, 1.forEach循环与some循环 代码如下: <script> const arr =['奔驰','宝马','GTR','奥迪'] //forEach循环 ...
- python test
#!/usr/bin/env python #-*- encoding: utf- -*- ''' def foo(name): print name, '去砍柴' foo('yangshanlei: ...
- Python序列函数、高级特性及高阶函数
序列函数: enumerate: for循环时记录索引,逐个返回元组(i, item) sorted:返回新的有序列表 zip:压缩将多个序列的对应位置的元素组成元组 zip(*元组列表): 解压缩 ...
- 使用javascript模拟常见数据结构(一)
数据结构和算法可算是每个程序员的必备技能,而随着前端工作的深入,对于数据结构的知识真的是越来越需要掌握了.好了,于是乎最近看了<javascript数据结构和算法>,算是对于后面的使用C语 ...
- simrank
simrank 背景 度量相似度是许多应用的关键问题.传统方法与问题的领域相关,如文本匹配.计算交集.simrank则利用关联关系度量相似性,即"两个节点的相似性和各自邻域节点的相似度有关& ...
- ES5拓展
一.JSON拓展 1.JSON.parse(str,fun):将JSON字符串转为js对象 两个参数:str表示要处理的字符串:fun处理函数,函数有两个参数,属性名.属性值 // 定义json字符串 ...
- numpy_basic3
矩陣 矩阵是numpy.matrix类类型的对象,该类继承自numpy.ndarray,任何针对多维数组的操作,对矩阵同样有效,但是作为子类矩阵又结合其自身的特点,做了必要的扩充,比如:乘法计算.求逆 ...
- js数组的遍历(API)
1.for 循环 普通遍历方法,可优化,存下数组的length,避免每次都去获取数组的length,性能提升 for(var i=0;i<arr.length;i++){ console.log ...
随机推荐
- Python Django 功能模块
Python Django模块 Django模块,是针对有django基础,对django功能进行模块化,方便下次使用. 一.注册模块 该注册采用邮箱验证,注册成功后会发送激活链接到邮箱. 邮箱验证参 ...
- java基础题(4)
5.4接口和抽象类 5.4.1实现抽象方法 描述: 已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法.要求定义Base的子类Su ...
- STL栈与队列
#include<queue>// 队列 #include<stack>//栈 stack<int> s;//参数也是数据类型,这是栈的定义方式 queue< ...
- GDKOI 2021 Day1 PJ 爆炸记
早上睡到 7:10 分才想起今天有 GDKOI ,赶紧去买了一个面包赶去机房 发现隔壁的大奆都过来了.比赛时由于昨晚一直没睡好,打了两个小时的哈欠 T1 :暴力模拟 根据 \(r\) 和 \(c\) ...
- FlinkSQL 之乱序问题
乱序问题 在业务编写 FlinkSQL 时, 非常常见的就是乱序相关问题, 在出现问题时,非常难以排查,且无法稳定复现,这样无论是业务方,还是平台方,都处于一种非常尴尬的地步. 在实时 join 中, ...
- 【Java集合】ArrayDeque源码解读
简介 双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列. ArrayDeque是一种以循环数组方式实现的双端队列,它是非线程安全的. 它既可以作为队列也可以作为栈. 继承体系 Arr ...
- 写个js获取2019博客之星投票活动的名次与投票数
获取投票数 // app.jsvar request = require('request');var cheerio = require('cheerio');request('http://m23 ...
- 简述基于CPU的机器码运行过程
引言:会写日志的人不一定是优秀的人,但优秀的人往往是会写日志的 这里涉及五个部分,胡歌,林拜,贾以枚,罗伊人,冯眷眷-林拜老婆 依次对应CPU里的控制器, CPU里的寄存器,存储器,输入电路,输出电路 ...
- ms08-067漏洞复现
一.环境说明 kali linux 靶机是 XP (xp启动445) 二.nmap扫描主机存在的漏洞 root@kali:~# nmap --script smb-vuln* 192.168.244. ...
- UiPath视频教程
UiPath机器人企业框架简介https://www.bilibili.com/video/BV1SK411L7u9 UiPath借助第三方Pdf软件工作https://www.bilibili.co ...