3.4.6 统计每门课程信息(Ci)
package couerse_info; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; /* stu[0]:课程名称 stu[1]:学生姓名 stu[2]:成绩 stu[3]:性别 stu[4]:年龄 该功能实现的是:通过指定信息查找学生课程考试信息 */ public class CiMapper extends Mapper<LongWritable,Text,Text,Text> { @Override protected void map(LongWritable Key1, Text value1,Context context) throws IOException, InterruptedException { //将文件的每一行传递过来,使用split分割后利用字符数组进行接收 String[] splits= value1.toString().split(","); //拼接字符串:学生名和成绩 String course = splits[0]; String name = splits[1]; String score = splits[2]; String course_info = name + ":" + score; //向Reducer传递参数-> Key:课程 Value:学生名+成绩 context.write(new Text(course),new Text(course_info)); } } package couerse_info; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class ciReducer extends Reducer<Text, Text,Text, Text> { @Override protected void reduce(Text key,Iterable<Text> values,Context context)throws IOException,InterruptedException{ //拼接课程的学生姓名和成绩 String courseInfo = "\n"; for(Text Info:values){ courseInfo = courseInfo + Info + " "; } System.out.println(key.toString()+":"+courseInfo); System.out.println("***********************************************************************************************************************"); context.write(key,new Text(courseInfo)); } }
package couerse_info; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; public class CiMain { public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException { //创建job和“统计相同课程相同分数的人数”任务入口 Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(CiMain.class); //设置Mapper和Reducer的入口 job.setMapperClass(CiMapper.class); job.setReducerClass(ciReducer.class); //设置Mapper的输入输出类型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(Text.class); //设置Reducer的输入输出类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); //指定输入输出路径 String inputPath = "hdfs://localhost:9000/mapreduce/input/学生成绩.csv"; String outputPath = "hdfs://localhost:9000/mapreduce/output/课程信息.txt"; FileInputFormat.setInputPaths(job,new Path(inputPath)); FileOutputFormat.setOutputPath(job,new Path(outputPath)); //输出路径存在的话就删除,不然就只能手动删除,否则会报该文件已存在的异常 FileSystem fileSystem = FileSystem.get(new URI(outputPath), conf); if (fileSystem.exists(new Path(outputPath))) { fileSystem.delete(new Path(outputPath), true); } //执行job job.waitForCompletion(true); } }
4 运行
5 改进
至此一个完整的基于mapreduce的学生成绩分析系统就算是基本完成了,当然完成的功能还是十分的基础。如果想要追求进阶操作,可以尝试使用多重处理,即把一个甚至多个mapreduce处理得到的结果当做是一个数据集,对该结果继续进行mapreduce分析。如果有意愿还可以再进一步分析,反正越分析越详细,这可能就是你课设比别人突出的部分,是一个大大的加分项。