MR学生成绩等级统计
数据:
English,liudehua,80
English,lijing,79
English,nezha,85
English,jinzha,60
English,muzha,71
English,houzi,99
English,libai,88
English,hanxin,66
English,zhugeliang,95
Math,liudehua,74
Math,lijing,72
Math,nezha,95
Math,jinzha,61
Math,muzha,37
Math,houzi,37
Math,libai,84
Math,hanxin,89
Math,zhugeliang,93
Computer,liudehua,54
Computer,lijing,73
Computer,nezha,86
Computer,jinzha,96
Computer,muzha,76
Computer,houzi,92
Computer,libai,73
Computer,hanxin,82
Computer,zhugeliang,100
背景:
学校的学生的是一个非常大的生成数据的集体,比如每次考试的成绩
现有一个班级的学生一个月的考试成绩数据。
科目 姓名 分数
需求:
求出每门成绩中属于甲级的学生人数和总人数
乙级的学生人数和总人数
丙级的学生人数和总人数
甲级(90及以上)乙级(80到89)丙级(0到79)
处理数据结果:
课程\t甲级\t学生1,学生2,…\t总人数
Map阶段:
package bigdata12.homework10.grade2;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* 学习成绩统计Map阶段
* @author Fantome
* @date 2019/6/19
*/
public class GradeMap extends Mapper<LongWritable, Text,Text,Text> {
Text k=new Text();
Text v=new Text();
/**
*
* @param key LongWritable
* @param value 输入信息:subject,name,grade
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(LongWritable key,
Text value,
Context context) throws IOException, InterruptedException {
String[] splits = value.toString().split(",");
//按subject在reduce端聚合
k.set(splits[0]);
v.set(splits[1]+"\t"+splits[2]);
context.write(k,v);
}
}
Reduce阶段:
package bigdata12.homework10.grade2;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
* 学习成绩统计Reduce阶段
* @author Fantome
* @date 2019/6/19
*/
public class GradeReduce extends Reducer<Text,Text,Text, NullWritable> {
Text k=new Text();
/**
* 获取学生信息并进行等级统计
* @param subject 学科
* @param infos 学科的学生成绩信息
* @param context
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void reduce(Text subject, Iterable<Text> infos, Context context) throws IOException, InterruptedException {
//聚合同一等级的学生姓名
StringBuffer nameA =new StringBuffer();
StringBuffer nameB =new StringBuffer();
StringBuffer nameC =new StringBuffer();
//对同一等级的学生进行计数
int nameANum=0;
int nameBNum=0;
int nameCNum=0;
for (Text info:infos){
//info: name+\t+grade
String[] splits = info.toString().split("\t");
String name=splits[0];
int grede=Integer.parseInt(splits[1]);
if(grede>=90){
nameA.append(name+":"+grede+",");
nameANum+=1;
}else if(grede>=80){
nameB.append(name+":"+grede+",");
nameBNum+=1;
}else {
nameC.append(name+":"+grede+",");
nameCNum+=1;
}
}
//输出 课程\t甲级\t学生1,学生2,...\t总人数
k.set(subject+"\t甲级\t"+nameA+"\t"+nameANum+"人\r\n"+
subject+"\t乙级\t"+nameB+"\t"+nameBNum+"人\r\n"+
subject+"\t丙级\t"+nameC+"\t"+nameCNum+"人");
context.write(k,NullWritable.get());
}
}