问题描述:
问:给一个文本数据,里面包含学生学号,学生姓名,学科名称,成绩。求各科成绩的最高分。
解决方案:
Mapper类:
public class MaxScoreMapper extends Mapper<LongWritable, Text, Text,LongWritable> {
Text subject = new Text();
LongWritable score = new LongWritable();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] split = value.toString().split(",");
subject.set(split[2]);
score.set(Integer.parseInt(split[3]));
context.write(subject,score);
}
}
Reduce类
public class MaxScoreReducer extends Reducer<Text,LongWritable,Text,LongWritable> {
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
long max = 0;
for (LongWritable longWritable : values) {
if (longWritable.get() > max)
max = longWritable.get();
}
System.out.println(key + "最高成绩为:" + max);
context.write(key, new LongWritable(max));
}
}
Driver类:
public class MaxScoreDriver {
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
job.setJarByClass(MaxScoreDriver.class);
job.setMapperClass(MaxScoreMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
job.setReducerClass(MaxScoreReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//输入的文本数据的路径
FileInputFormat.setInputPaths(job,new Path("D:\\IDEAprojects\\hadoopStu\\in\\demo3\\stuscore.csv"));
//输出结果的路径
Path path = new Path("D:\\IDEAprojects\\hadoopStu\\out5");
FileSystem fs = FileSystem.get(path.toUri(),conf);
if(fs.exists(path))
{
fs.delete(path,true);
}
FileOutputFormat.setOutputPath(job,path);
job.waitForCompletion(true);
}
}