MR案例:分区和排序
2015-08-20 14:42
309 查看
现有一学生成绩数据,格式如下:<学号,姓名,学院,成绩> //<id, name, institute, grade>。
需求描述:查询成绩大于等于60分的学生数据,按学院分组,组内按成绩从小到大排序。
使用SQL描述:
在MR下应该怎么做?
1.map阶段选择成绩>=60分的学生。
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个数 < 分区个数)。
3.shuffle阶段按照学生成绩排序
综合阶段2和3的需求,完全可以自定义Writable类实现分区的hashCode() 和 排序的compareTo()方法。
4.Reduce阶段
由于已在 Partition阶段,将相同的学院分到同一个 reduce。并且在 Shuffle 阶段按照成绩排好序,所以reduce阶段只需要输出即可。
由于特殊原因,只能进行伪代码分析,实际代码有时间补上。
需求描述:查询成绩大于等于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[2]));
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) }
由于特殊原因,只能进行伪代码分析,实际代码有时间补上。
相关文章推荐
- hibernate.properties配置文件
- 程序员的分级理解
- android的Intent用法实例
- Hadoop分布式文件系统:架构和设计要点
- ssdb 主从同步复制配置详细步骤
- 面试问题
- POJ 1061 青蛙的约会.
- 详解refreshDrawableList()的执行流程
- 获取ios系统的deviceModel, deviceName, systemName, systemVersion
- 使用JAVA实现语音朗读一段文本
- 软件工程基础知识----软件概述
- Log4j配置实例(log4j.xml)
- 笔记整理之vim编辑器
- EmguCV Image类中的函数(一)
- Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid ...
- 数据结构六:二叉树的先序建树与中序的非递归遍历算法
- 人际吸引法则
- error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
- 《西游记》--女儿情(简谱)
- servlet 上传文件 参数中文乱码