MR案例:分区和排序
现有一学生成绩数据,格式如下:<学号,姓名,学院,成绩> //<id, name, institute, grade>。
需求描述:查询成绩大于等于60分的学生数据,按学院分组,组内按成绩从小到大排序。
使用SQL描述:
Select * from table
where grade >= 60
group by institute
order by grade;
在MR下应该怎么做?
1.map阶段选择成绩>=60分的学生。
Class SelectMapper
method map(LongWritable, Text, InfoWritable, Text){
splited[] = value.toString().split(",");
InfoWritable =new InfoWritable(splited[2], splited[3]);
TextOut = new Text(splited[0]+"\t"+splited[1]);
if(splited[3] >=60) //选择成绩满足条件的输出
context.write(InfoWritable, TextOut)
}
2.partition阶段按照学生的学院进行分区。【两种选择】
2.1.覆写基类Partitioner的getPartition()方法
2.2.覆写默认分区类HashPartition的getPartition()方法,默认是根据key的hash值进行分区的,即学院字段的hash值。
2.3.对于指定分区的例子必须打成JAR包运行,这是因为在eclipse上其实是local单机模式。会报java.io.IOException: Illegal partition for ...异常(同理于R个数 < 分区个数)。
//根据 分区函数 的返回值产生相应编号的结果文件part-r-0000*
//如返回值为 3 ,则对应 part-r-00003 结果文件
job.setPartitionerClass(ProviderPartitioner.class);
//显示指定需要的Reduce个数【应该大于等于分区个数】
//如果 R个数 < 分区个数,则报IO异常错误
//如果 R个数 > 分区个数:如指定了4个分区,但运行6个R任务,则返回6个结果文件,其中两个空文件
job.setNumReduceTasks(Integer.parseInt(args[]));
3.shuffle阶段按照学生成绩排序
综合阶段2和3的需求,完全可以自定义Writable类实现分区的hashCode() 和 排序的compareTo()方法。
Class InfoWritable implements WritableComparable
private int xueyuan; //学院编号字段
private double chengji; //成绩字段
method hashCode(){
return xueyuan * 18;//hash值只和学院有关,相同学院分到同一个reduce
}
method compareTo(InfoWritable o){
if(this.xueyuan.compareTo(o.xueyuan) ==0) //先按照学院排序(升序)
return this.chengji.compareTo(o.chengji); //再按照成绩排序(升序)
else return this.xueyuan.compareTo(o.xueyuan);
}
4.Reduce阶段
由于已在 Partition阶段,将相同的学院分到同一个 reduce。并且在 Shuffle 阶段按照成绩排好序,所以reduce阶段只需要输出即可。
Class SelectReduce
method reduce(InfoWritable, Texts, Text InfoWritable)
for(Text text : Texts){
contex.writable(text, InfoWritable)
}
由于特殊原因,只能进行伪代码分析,实际代码有时间补上。
MR案例:分区和排序的更多相关文章
- Hadoop【MR的分区、排序、分组】
[toc] 一.分区 问题:按照条件将结果输出到不同文件中 自定义分区步骤 1.自定义继承Partitioner类,重写getPartition()方法 2.在job驱动Driver中设置自定义的Pa ...
- MR案例:倒排索引
1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...
- MR案例:小文件处理方案
HDFS被设计来存储大文件,而有时候会有大量的小文件生成,造成NameNode资源的浪费,同时也影响MapReduce的处理效率.有哪些方案可以合并这些小文件,或者提高处理小文件的效率呢? 1). 所 ...
- MapReduce分区和排序
一.排序 排序: 需求:根据用户每月使用的流量按照使用的流量多少排序 接口-->WritableCompareable 排序操作在hadoop中属于默认的行为.默认按照字典殊勋排序. 排序的分类 ...
- MR案例:Reduce-Join
问题描述:两种类型输入文件:address(地址)和company(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD.Beijing Red Star ...
- C++ STL 之 deque容器 打分案例(内含sort排序用法)
#include <iostream> #include <vector> #include <time.h> #include <deque> #in ...
- Mapreduce的排序(全局排序、分区加排序、Combiner优化)
一.MR排序的分类 1.部分排序:MR会根据自己输出记录的KV对数据进行排序,保证输出到每一个文件内存都是经过排序的: 2.全局排序: 3.辅助排序:再第一次排序后经过分区再排序一次: 4.二次排序: ...
- MapReduce对交易日志进行排序的Demo(MR的二次排序)
1.日志源文件 (各个列分别是: 账户,营业额,花费,日期) zhangsan@163.com 6000 0 2014-02-20 lisi@163.com 2000 0 2014-02-20 lis ...
- RDD 重新分区,排序 repartitionAndSortWithinPartitions
需求:将rdd数据中相同班级的学生分到一个partition中,并根据分数降序排序. 此实例用到的repartitionAndSortWithinPartitions是Spark官网推荐的一个算子,官 ...
随机推荐
- centos安装Oracle virtual box
1.进入virtualbox官网 https://www.virtualbox.org/wiki/Downloads 2.点击Linux distributions 3.向下翻至如图 4.在/etc/ ...
- 使用 paramsPrepareParamsStack 拦截器栈后的运行流程
2. 使用 paramsPrepareParamsStack 拦截器栈后的运行流程 1). paramsPrepareParamsStack 和 defaultStack 一样都是拦截器栈. 而 st ...
- Python IDE软件PyCharm通用激活方法
1,打开软件点击help-Register 2,输入地址http://xidea.online激活
- 【转】SignalR来做实时Web聊天
本章和大家分享的内容是使用Signal R框架创建个简易的群聊功能,主要讲解如何在.Net的MVC中使用这个框架,由于这个项目有官方文档(当然全英文),后面也不打算写分享篇了,主要目的是让朋友们在需要 ...
- TOMCAT------>web资源访问
1.web应用达成war包 通过命令行打war包:jar -cvf xxx.war xxx 因为放到webapps里电脑会自动识别,自动解压 2.relodeable="true" ...
- How an event flows in a pipeline Netty Internal I/O Threads (Transport Implementation)
C:\Users\sas\.m2\repository\io\netty\netty-all\4.1.30.Final\netty-all-4.1.30.Final-sources.jar!\io\n ...
- 新团建立时间 timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
w 不根据当前时间戳更新. `wtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
- 关于HashSet在 java7 与 java8的不同
作者:RednaxelaFX链接:https://www.zhihu.com/question/28414001/answer/40733996来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- 【opencv入门篇】快速在VS上配置opencv
环境配置:win7-32 + opencv2.4.6 + vs2013 注意:无论电脑是32位还是64位,配置opencv库目录时选择x84文件夹!因为编译都是使用32位编译:如果选用X64,则程序运 ...
- 对BeforeSuite和BeforeTest的理解
在BeforeSuite.BeforeTest.BeforeClass.BeforeMethod及BeforeGroups中,后面三个注解都比较好理解,其实BeforeSuite.BeforeTest ...