现有一学生成绩数据,格式如下:<学号,姓名,学院,成绩>  //<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案例:分区和排序的更多相关文章

  1. Hadoop【MR的分区、排序、分组】

    [toc] 一.分区 问题:按照条件将结果输出到不同文件中 自定义分区步骤 1.自定义继承Partitioner类,重写getPartition()方法 2.在job驱动Driver中设置自定义的Pa ...

  2. MR案例:倒排索引

    1.map阶段:将单词和URI组成Key值(如“MapReduce :1.txt”),将词频作为value. 利用MR框架自带的Map端排序,将同一文档的相同单词的词频组成列表,传递给Combine过 ...

  3. MR案例:小文件处理方案

    HDFS被设计来存储大文件,而有时候会有大量的小文件生成,造成NameNode资源的浪费,同时也影响MapReduce的处理效率.有哪些方案可以合并这些小文件,或者提高处理小文件的效率呢? 1). 所 ...

  4. MapReduce分区和排序

    一.排序 排序: 需求:根据用户每月使用的流量按照使用的流量多少排序 接口-->WritableCompareable 排序操作在hadoop中属于默认的行为.默认按照字典殊勋排序. 排序的分类 ...

  5. MR案例:Reduce-Join

    问题描述:两种类型输入文件:address(地址)和company(公司)进行一对多的关联查询,得到地址名(例如:Beijing)与公司名(例如:Beijing JD.Beijing Red Star ...

  6. C++ STL 之 deque容器 打分案例(内含sort排序用法)

    #include <iostream> #include <vector> #include <time.h> #include <deque> #in ...

  7. Mapreduce的排序(全局排序、分区加排序、Combiner优化)

    一.MR排序的分类 1.部分排序:MR会根据自己输出记录的KV对数据进行排序,保证输出到每一个文件内存都是经过排序的: 2.全局排序: 3.辅助排序:再第一次排序后经过分区再排序一次: 4.二次排序: ...

  8. MapReduce对交易日志进行排序的Demo(MR的二次排序)

    1.日志源文件 (各个列分别是: 账户,营业额,花费,日期) zhangsan@163.com 6000 0 2014-02-20 lisi@163.com 2000 0 2014-02-20 lis ...

  9. RDD 重新分区,排序 repartitionAndSortWithinPartitions

    需求:将rdd数据中相同班级的学生分到一个partition中,并根据分数降序排序. 此实例用到的repartitionAndSortWithinPartitions是Spark官网推荐的一个算子,官 ...

随机推荐

  1. AI画圆角矩形

    如何画圆角矩形:设置矩形圆角大小 第一种方法:点击圆角矩形在画布上点一下; [caption id="attachment_878" align="alignnone&q ...

  2. netstat -tulpn

    [root@d java]# netstat -tulpnActive Internet connections (only servers)Proto Recv-Q Send-Q Local Add ...

  3. mysql - json - look up subobjects or nested values directly by key or array index without reading all values

    w https://dev.mysql.com/doc/refman/5.7/en/json.html

  4. Linux下安装谷歌访问助手,解压缩时出现中文乱码

    1.sudo apt-get install unar 安装unar 2.unar 谷歌访问助手chrome版本.zip   注意:使用 lsar 命令可以查看压缩文件内有那些文件: 例:lsar 谷 ...

  5. px、dp、sp、mm、in、pt这些单位有什么区别?

    相信每个Android新手都会遇到这个问题,希望这篇帖子能让你不再纠结. px: 即像素,1px代表屏幕上一个物理的像素点: px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小 ...

  6. 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS 笔记

    队列服务就是为了提高相应速度,把耗时或者不需要即时处理的流程放到异步处理过程中,HTTPSQS就是这样一个服务. 更详细的可以参考 http://blog.s135.com/httpsqs/,这里记录 ...

  7. vue下登录页背景图上下空白处自适应等高

    遇到需求,登录页面需要顶部和底部上下等高,并且随着浏览器自适应上下高度. 解决方法: vue界面的data中先定义 data() { return { windowHeight: "&quo ...

  8. Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

    转载自 https://www.cnblogs.com/luyingfeng/p/6386093.html 安全起见,数据库的访问多半是要做限制的,所以就有一个直接的问题是,往往多数时候,在别的机器上 ...

  9. BD面试题1-两个大文件中找出公共记录[转载]

    转自:https://blog.csdn.net/tiankong_/article/details/77234726#commentBox 1.题目 给定a.b两个文件,各存放50亿个url,每个u ...

  10. C++基础之头文件和源文件的关系

    今天找了个解析xml的开源C++项目tinyxml,按照网上的说法去编译,但是一直编译不通过,"无法打开头文件tinyxml.h",但是明明我在工程底下有了这个文件,对于我这种初学 ...