当前位置:   article > 正文

MapReduce--13--学生成绩(增强版)--需求2_com.ghgj.mr.exercise.pojo.coursescore;

com.ghgj.mr.exercise.pojo.coursescore;

题目描述

关于对于学生成绩相关的练习题,之前是一个入门级别的需求,现在对这些需求进行增强,首先看数据的改变:

  1. computer,huangxiaoming,85,86,41,75,93,42,85
  2. computer,xuzheng,54,52,86,91,42
  3. computer,huangbo,85,42,96,38
  4. english,zhaobenshan,54,52,86,91,42,85,75
  5. english,liuyifei,85,41,75,21,85,96,14
  6. algorithm,liuyifei,75,85,62,48,54,96,15
  7. computer,huangjiaju,85,75,86,85,85
  8. english,liuyifei,76,95,86,74,68,74,48
  9. english,huangdatou,48,58,67,86,15,33,85
  10. algorithm,huanglei,76,95,86,74,68,74,48
  11. algorithm,huangjiaju,85,75,86,85,85,74,86
  12. computer,huangdatou,48,58,67,86,15,33,85
  13. english,zhouqi,85,86,41,75,93,42,85,75,55,47,22
  14. english,huangbo,85,42,96,38,55,47,22
  15. algorithm,liutao,85,75,85,99,66
  16. computer,huangzitao,85,86,41,75,93,42,85
  17. math,wangbaoqiang,85,86,41,75,93,42,85
  18. computer,liujialing,85,41,75,21,85,96,14,74,86
  19. computer,liuyifei,75,85,62,48,54,96,15
  20. computer,liutao,85,75,85,99,66,88,75,91
  21. computer,huanglei,76,95,86,74,68,74,48
  22. english,liujialing,75,85,62,48,54,96,15
  23. math,huanglei,76,95,86,74,68,74,48
  24. math,huangjiaju,85,75,86,85,85,74,86
  25. math,liutao,48,58,67,86,15,33,85
  26. english,huanglei,85,75,85,99,66,88,75,91
  27. math,xuzheng,54,52,86,91,42,85,75
  28. math,huangxiaoming,85,75,85,99,66,88,75,91
  29. math,liujialing,85,86,41,75,93,42,85,75
  30. english,huangxiaoming,85,86,41,75,93,42,85
  31. algorithm,huangdatou,48,58,67,86,15,33,85
  32. algorithm,huangzitao,85,86,41,75,93,42,85,75

一、数据解释

数据字段个数不固定:
第一个是课程名称,总共四个课程,computer,math,english,algorithm,
第二个是学生姓名,后面是每次考试的分数

 

二、统计需求:

1、统计每门课程的参考人数和课程平均分

2、统计每门课程参考学生的平均分,并且按课程存入不同的结果文件,要求一门课程一个结果文件,并且按平均分从高到低排序,分数保留一位小数

3、求出每门课程参考学生成绩最高的学生的信息:课程,姓名和平均分

 

三、解题思路

mapper阶段的输出:

key: CourseScore

value: NullWritable

reducer阶段的输出:

key:CourseScore

value:NullWritable

 

四、代码实现

  1. package com.ghgj.mazh.mapreduce.exercise.coursescore3;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.fs.FileSystem;
  4. import org.apache.hadoop.fs.Path;
  5. import org.apache.hadoop.hive.ql.metadata.Partition;
  6. import org.apache.hadoop.io.LongWritable;
  7. import org.apache.hadoop.io.NullWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;
  10. import org.apache.hadoop.mapreduce.Mapper;
  11. import org.apache.hadoop.mapreduce.Partitioner;
  12. import org.apache.hadoop.mapreduce.Reducer;
  13. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  14. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  15. import java.io.IOException;
  16. import java.util.ArrayList;
  17. import java.util.Collections;
  18. import java.util.List;
  19. public class CourseScoreMR_Pro_02 {
  20. public static void main(String[] args) throws Exception {
  21. /**
  22. * 一些参数的初始化
  23. */
  24. String inputPath = "D:\\bigdata\\coursescore2\\input";
  25. String outputPath = "D:\\bigdata\\coursescore2\\output2";
  26. /**
  27. * 初始化一个Job对象
  28. */
  29. Configuration conf = new Configuration();
  30. Job job = Job.getInstance(conf);
  31. /**
  32. * 设置jar包所在路径
  33. */
  34. job.setJarByClass(CourseScoreMR_Pro_02.class);
  35. /**
  36. * 指定mapper类和reducer类 等各种其他业务逻辑组件
  37. */
  38. job.setMapperClass(Mapper_CS.class);
  39. job.setReducerClass(Reducer.class);
  40. // 指定maptask的输出类型
  41. job.setMapOutputKeyClass(CourseScore.class);
  42. job.setMapOutputValueClass(NullWritable.class);
  43. // 指定reducetask的输出类型
  44. job.setOutputKeyClass(CourseScore.class);
  45. job.setOutputValueClass(NullWritable.class);
  46. /**
  47. * 设置reduceTask数量和分区器
  48. */
  49. job.setNumReduceTasks(4);
  50. job.setPartitionerClass(MyPartitioner.class);
  51. /**
  52. * 指定该mapreduce程序数据的输入和输出路径
  53. */
  54. Path input = new Path(inputPath);
  55. Path output = new Path(outputPath);
  56. FileSystem fs = FileSystem.get(conf);
  57. if (fs.exists(output)) {
  58. fs.delete(output, true);
  59. }
  60. FileInputFormat.setInputPaths(job, input);
  61. FileOutputFormat.setOutputPath(job, output);
  62. /**
  63. * 最后提交任务
  64. */
  65. boolean waitForCompletion = job.waitForCompletion(true);
  66. System.exit(waitForCompletion ? 0 : 1);
  67. }
  68. /**
  69. * Mapper组件:
  70. * <p>
  71. * 输入的key:
  72. * 输入的value:
  73. * <p>
  74. * 输出的key:
  75. * 输入的value:
  76. */
  77. private static class Mapper_CS extends Mapper<LongWritable, Text, CourseScore, NullWritable> {
  78. CourseScore keyOut = new CourseScore();
  79. @Override
  80. protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  81. String[] splits = value.toString().split(",");
  82. String course = splits[0];
  83. String name = splits[1];
  84. int sum = 0;
  85. int num = 0;
  86. for(int i=2; i<splits.length; i++){
  87. sum += Integer.valueOf(splits[i]);
  88. num ++;
  89. }
  90. double avgScore = Math.round(sum * 1D / num * 10) / 10D;
  91. keyOut.setCourse(course);
  92. keyOut.setName(name);
  93. keyOut.setScore(avgScore);
  94. context.write(keyOut, NullWritable.get());
  95. }
  96. }
  97. /**
  98. * 自定义分区组件
  99. */
  100. public static class MyPartitioner extends Partitioner<CourseScore, NullWritable>{
  101. @Override
  102. public int getPartition(CourseScore courseScore, NullWritable nullWritable, int numPartitions) {
  103. String course = courseScore.getCourse();
  104. if(course.equals("computer")){
  105. return 0;
  106. }else if(course.equals("english")){
  107. return 1;
  108. }else if(course.equals("algorithm")){
  109. return 2;
  110. }else{
  111. return 3;
  112. }
  113. }
  114. }
  115. }

其中 CourseScore类的实现:

  1. package com.ghgj.mazh.mapreduce.exercise.coursescore3;
  2. import org.apache.hadoop.io.WritableComparable;
  3. import java.io.DataInput;
  4. import java.io.DataOutput;
  5. import java.io.IOException;
  6. public class CourseScore implements WritableComparable<CourseScore> {
  7. private String course;
  8. private String name;
  9. private double score;
  10. public CourseScore(String course, String name, double score) {
  11. super();
  12. this.course = course;
  13. this.name = name;
  14. this.score = score;
  15. }
  16. public CourseScore() {
  17. }
  18. public String getCourse() {
  19. return course;
  20. }
  21. public void setCourse(String course) {
  22. this.course = course;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public double getScore() {
  31. return score;
  32. }
  33. public void setScore(double score) {
  34. this.score = score;
  35. }
  36. @Override
  37. public void write(DataOutput out) throws IOException {
  38. // TODO Auto-generated method stub
  39. out.writeUTF(course);
  40. out.writeUTF(name);
  41. out.writeDouble(score);
  42. }
  43. @Override
  44. public void readFields(DataInput in) throws IOException {
  45. // TODO Auto-generated method stub
  46. this.course = in.readUTF();
  47. this.name = in.readUTF();
  48. this.score = in.readDouble();
  49. }
  50. /**
  51. * 排序规则
  52. * compareTo方法既充当排序用,用充当分组规则
  53. */
  54. @Override
  55. public int compareTo(CourseScore cs) {
  56. int compareTo = this.course.compareTo(cs.getCourse());
  57. if (compareTo == 0) {
  58. double diff = cs.getScore() - this.score;
  59. if (diff >
  60. 0) {
  61. return 1;
  62. } else if (diff < 0) {
  63. return -1;
  64. } else {
  65. return 0;
  66. }
  67. } else {
  68. return compareTo;
  69. }
  70. }
  71. @Override
  72. public String toString() {
  73. return course + "\t" + name + "\t" + score;
  74. }
  75. }

 

五、执行结果

 

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号