MapReduce典型编程场景——TopN算法自定义GroupComparator
来源:互联网 发布:mac广州专柜价格多少 编辑:程序博客网 时间:2024/06/03 21:32
1、需求
在统计学生成绩的小项目中,现有一个需求:求出每个班参考学生成绩最高的学生的信息,班级、姓名、平均分
2、分析
利用“班级和平均分”作为key,可以将map阶段读取到的所有学生成绩数据按照班级和成绩排倒叙,发送到reduce在reduce端利用GroupingComparator将班级相同的kv聚合成组,然后取第一个即是最大值
3、实现
第一步:先把分组和排序字段都综合到一个自定义对象里import java.io.DataInput;import java.io.DataOutput;import java.io.IOException;import org.apache.hadoop.io.WritableComparable;public class ClazzScore implements WritableComparable{ private String clazz; private Double score; public String getClazz() { return clazz; } public void setClazz(String clazz) { this.clazz = clazz; } public Double getScore() { return score; } public void setScore(Double score) { this.score = score; } public ClazzScore(String clazz, Double score) { super(); this.clazz = clazz; this.score = score; } public ClazzScore() { super(); } @Override public String toString() { return clazz + "\t" + score; } @Override // 序列化 public void write(DataOutput out) throws IOException { out.writeUTF(clazz); out.writeDouble(score); } @Override // 反序列化 public void readFields(DataInput in) throws IOException { this.clazz = in.readUTF(); this.score = in.readDouble(); } /** * key 排序 */ @Override public int compareTo(ClazzScore cs) { int it = cs.getClazz().compareTo(this.clazz); if(it == 0){ return (int) (cs.getScore() - this.score); }else{ return it; } }}
第二步:编写排序之后的ClazzScore数据传入ReduceTask的分组规则
import org.apache.hadoop.io.WritableComparable;import org.apache.hadoop.io.WritableComparator;public class ClazzScoreGroupComparator extends WritableComparator{ ClazzScoreGroupComparator(){ super(ClazzScore.class, true); } /** * 决定输入到 reduce 的数据的分组规则 */ @Override public int compare(WritableComparable a, WritableComparable b) { ClazzScore cs1 = (ClazzScore)a; ClazzScore cs2 = (ClazzScore)b; int it = cs1.getClazz().compareTo(cs2.getClazz()); return it; }}
import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.DoubleWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** * TopN 问题 */ public class ScoreTop1MR { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(ScoreTop1MR.class); job.setMapperClass(ScoreTop1MRMapper.class); job.setReducerClass(ScoreTop1MRReducer.class); job.setOutputKeyClass(ClazzScore.class); job.setOutputValueClass(DoubleWritable.class); // 设置传入 reducer 的数据分组规则 job.setGroupingComparatorClass(ClazzScoreGroupComparator.class); FileInputFormat.setInputPaths(job, "d:/score_all/input"); Path p = new Path("d:/score_all/output1"); FileSystem fs = FileSystem.newInstance(conf); if(fs.exists(p)){ fs.delete(p, true); } FileOutputFormat.setOutputPath(job, p); boolean status = job.waitForCompletion(true); System.exit(status ? 0 : 1); } static class ScoreTop1MRMapper extends Mapper{ @Override protected void map(LongWritable key, Text value, Context context) throws IOException,InterruptedException { String[] splits = value.toString().split("\t"); ClazzScore cs = new ClazzScore(splits[0], Double.parseDouble(splits[2])); context.write(cs, new DoubleWritable(Double.parseDouble(splits[2]))); } } static class ScoreTop1MRReducer extends Reducer{ @Override protected void reduce(ClazzScore cs, Iterable scores, Context context) throws IOException, InterruptedException { // 按照规则,取每组的第一个就是 Top1 context.write(cs, scores.iterator().next()); } }}
阅读全文
0 0
- MapReduce典型编程场景——TopN算法自定义GroupComparator
- MapReduce典型编程场景——多Job串联
- MapReduce典型编程场景——全局计数器
- hadoop topN mapreduce编程
- 算法(2) TopN Mapreduce/Spark
- MapReduce的GroupComparator
- MapReduce高级编程——自定义InputFormat
- MapReduce高级编程——自定义InputFormat
- mapreduce topN算法实现 获取前10个音乐数据
- topN 算法
- TopN算法
- 算法 topN
- TopN算法
- TopN算法
- MapReduce之topN
- MapReduce之TopN
- MapReduce统计TopN示例
- MapReduce TopN问题
- free/delete 释放的内存大小?
- <BEA-101017> <[ServletContext@1084932029[app:AuthorityApp module:qxgl path:/qxgl spec-version:null]]
- AJAX--XHR对象
- 第5篇博文
- Chips交互操作和集合论
- MapReduce典型编程场景——TopN算法自定义GroupComparator
- 英语论文写作笔记一则
- 如何让外置硬盘在苹果系统中正常读写
- 如何在Ubuntu 16.04下安装搜狗输入法
- 开发sidebox步骤
- angular4 route 总结
- TensorFlow技术解析与实战 4 基础知识
- 操作系统—初识操作系统
- 百度地图集成Demo过程中的问题(java.lang.UnsatisfiedLinkError:)