【細節拉滿】Hadoop課程設計項目,使用idea編寫基于MapReduce的學生成績分析系統(附帶源碼、項目文件下載地址)

目錄

1 數據源(學生成績.csv)

2 hadoop平臺上傳數據源

3 idea代碼

3.1 工程框架

3.2 導入依賴

3.3 系統主入口(menu)

3.4 六個mapreduce

3.4.1?計算每門成績的最高分、最低分、平均分(Mma)

3.4.2?計算每個學生的總分及平均成績并進行排序(Sas)

3.4.3?統計所有學生的信息(Si)

3.4.4?統計每門課程中相同分數分布情況(Css)

3.4.5?統計各性別的人數及他們的姓名(Snn)

3.4.6?統計每門課程信息(Ci)

4 運行

5 改進


? ? ? ? ?本文只是用來分享代碼,如果想要學習MapReduce如何去寫的請轉至下面的參考博客,該篇博客以“”統計每門課程中相同分數分布情況”為模板,從問題分析入手,一步步創建一個mapper、reducer和main(driver)從而組成一整個的MapReduce。

【手把手 腦把腦】教會你使用idea基于MapReduce的統計數據分析(從問題分析到代碼編寫)_扎哇太棗糕的博客-CSDN博客

不想跟著博客一步步操作的也可以選擇直接下載項目文件,并在自己的idea上運行,數據源依舊是以下的學生成績。

Hadoop-MapReduce項目代碼ZIP壓縮包+面向小白(注釋詳細清晰)-Hadoop文檔類資源-CSDN下載

1 數據源(學生成績.csv)

💥 舊坑勿踩:可以復制下面數據,粘貼到txt里把文件拓展格式改為csv,在上傳至Hadoop平臺之前一定要確保文件的編碼方式為utf-8(否則中文會亂碼),具體操作為使用記事本打開學生成績.csv文件,看右下角的編碼方式,如果不是utf-8則可以將文件另存為時修改其編碼方式。

💥一定一定一定不要為了元數據的好看就在第一行為數據加字段名,看是好看了,到時候運行不出來結果就很難受,不要問我怎么知道的,一個下午的血淋淋的教訓。

英語,李沐,85,男,20
數學,李沐,54,男,20
音樂,李沐,54,男,20
體育,李沐,34,男,20
語文,李媛,81,女,20
音樂,李媛,85,女,20
體育,李媛,89,女,20
語文,馬珂,75,女,19
英語,馬珂,85,女,19
音樂,馬珂,75,女,19
體育,馬珂,65,女,19
語文,潘琴,42,女,20
英語,潘琴,48,女,20
音樂,潘琴,48,女,20
體育,潘琴,78,女,20
英語,秦燦,75,男,19
數學,秦燦,89,男,19
音樂,秦燦,85,男,19
體育,秦燦,99,男,19
語文,王靚,85,女,21
英語,王靚,85,女,21
數學,王靚,48,女,21
音樂,王靚,86,女,21
音樂,王靚,85,女,21
體育,王靚,96,女,21
體育,王靚,87,女,21
英語,吳起,85,男,20
數學,吳起,85,男,20
英語,張翔,96,男,20
數學,張翔,85,男,20
音樂,張翔,85,男,20
體育,張翔,87,男,20
語文,鄭虎,85,男,20
數學,鄭虎,85,男,20
音樂,鄭虎,88,男,20
體育,鄭虎,68,男,20
語文,周偉,76,男,19
英語,周偉,85,男,19
數學,周偉,76,男,19
音樂,周偉,99,男,19
體育,周偉,90,男,19
數學,朱鴻,90,男,21
音樂,朱鴻,80,男,21
體育,朱鴻,81,男,21

2 hadoop平臺上傳數據源

????????Hadoop平臺上傳數據,其實也可以理解為向HDFS里存儲數據,前提是Hadoop的集群必須搭建好,這里就默認大家都已經搭建完成并可以正常運行。這里可以如下圖雙擊hadoop下的sbin目錄下的start-all.cmd啟動集群。

????????集群啟動成功后,在源數據的存儲路徑下打開DOS窗口,可以在該目錄的文件路徑框下輸入cmd打開,或者直接在桌面打開DOS窗口再cd進源數據的存儲路徑。按照下圖使用命令創建目錄并將源數據(學生成績.csv)上傳至hadoop平臺

3 idea代碼

3.1 工程框架

新建一個maven工程,建立如下工程框架 :

3.2 導入依賴

????????MapReduce需要四個核心依賴,hadoop-client、hadoop-hdfs、hadoop-common、hadoop-mapreduce-client-core,依賴復制粘貼進自己的項目一定要記得刷新依賴,避免依賴還沒導入成功就運行導致報錯。

<dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.7.3</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-mapreduce-client-core</artifactId><version>2.7.3</version></dependency>
</dependencies>

3.3 系統主入口(menu)

//這里的導包是完成跨package調用其它包里的類
import couerse_info.CiMain;
import course_score_same.CssMain;
import max_min_avg.MmaMain;
import sex_number_name.SnnMain;
import student_info.SiMain;
import sum_avg_sort.SasMain;import java.lang.reflect.Method;
import java.util.Scanner;public class menu {public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);while(true){System.out.println("=========基于MapReduce的學生成績分析=========");System.out.println("1、計算每門成績的最高分、最低分、平均分");System.out.println("2、計算每個學生的總分及平均成績并進行排序");System.out.println("3、統計所有學生的信息");System.out.println("4、統計每門課程中相同分數分布情況");System.out.println("5、統計各性別的人數及他們的姓名");System.out.println("6、統計每門課程信息");System.out.println("7、退出");System.out.print("請輸入你想要選擇的功能:");int option = scanner.nextInt();Method method = null;switch(option){case 1:method = MmaMain.class.getMethod("main", String[].class);method.invoke(null, (Object) new String[] {});break;case 2:method = SasMain.class.getMethod("main", String[].class);method.invoke(null, (Object) new String[] {});break;case 3:method = SiMain.class.getMethod("main", String[].class);method.invoke(null, (Object) new String[] {});break;case 4:method = CssMain.class.getMethod("main", String[].class);method.invoke(null, (Object) new String[] {});break;case 5:method = SnnMain.class.getMethod("main", String[].class);method.invoke(null, (Object) new String[] {});break;case 6:method = CiMain.class.getMethod("main", String[].class);method.invoke(null, (Object) new String[] {});break;case 7:System.exit(1);break;default:System.out.println("輸入正確的功能按鍵!!");break;}}} catch (Exception e) {e.printStackTrace();}}
}

3.4 六個mapreduce

3.4.1?計算每門成績的最高分、最低分、平均分(Mma)

package max_min_avg;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 MmaMapper extends Mapper<LongWritable,Text,Text,Text> {@Overrideprotected void map(LongWritable key1,Text value1,Context context)throws IOException,InterruptedException{//將文件的每一行傳遞過來,使用split分割后利用字符數組進行接收String[] splits = value1.toString().split(",");//向Reducer傳遞參數-> Key:課程 Value:成績context.write(new Text(splits[0]),new Text(splits[2]));}
}
package max_min_avg;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class MmaReducer extends Reducer<Text, Text,Text, Text> {@Overrideprotected void reduce(Text key,Iterable<Text> value,Context context)throws IOException,InterruptedException{//Arraylist集合儲存所有的成績數據,借用collections的方法求最大值最小值List<Integer> list = new ArrayList<>();for(Text v: value){list.add(Integer.valueOf(v.toString()));}//求max及minint maxScore = Collections.max(list);int minScore = Collections.min(list);// 求平均成績int sum = 0;for(int score: list){sum += score;}double avg = sum  / list.size();System.out.println("*****************************************");String result = "的最高分:"+maxScore+"    最低分:"+minScore+"    平均分:"+avg;System.out.println(key.toString()+result);context.write(key,new Text(result));}
}
package max_min_avg;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 MmaMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//創建job和“統計相同課程相同分數的人數”任務入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(MmaMain.class);//設置Mapper和Reducer的入口job.setMapperClass(MmaMapper.class);job.setReducerClass(MmaReducer.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);}//執行jobjob.waitForCompletion(true);}
}

3.4.2?計算每個學生的總分及平均成績并進行排序(Sas)

package sum_avg_sort;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 SasMapper extends Mapper<LongWritable, Text,Text,Text> {@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {//將文件的每一行傳遞過來,使用split分割后利用字符數組進行接收String[] stu = value.toString().split(",");//向Reducer傳遞參數-> Key:學生姓名 Value:成績context.write(new Text(stu[1]),new Text(stu[2]));}
}
package sum_avg_sort;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class SasReducer extends Reducer<Text,Text,Text,Text> {@Overrideprotected void reduce(Text key, Iterable<Text> values,Context context) throws IOException, InterruptedException {System.out.println("*********************************************************************");//定義一個ArrayList集合接收該學生的各項成績List<Integer> scores = new ArrayList<>();for(Text value:values){scores.add(Integer.valueOf(value.toString()));}//對該學生的成績進行求總分、平均分int num = 0, sum = 0;for(Integer score:scores){sum = sum + score.intValue();num = num + 1;}float avg = sum / num;//成績排序Collections.sort(scores);//使用一個字符串拼接排好序的所有成績String sort = "的總分:"+sum+" 平均分:"+avg+" 該生的成績從低到高排序是:";for(Integer score:scores){sort = sort + score + "  ";}System.out.println(key.toString()+sort);//輸出context.write(key,new Text(sort));}
}
package sum_avg_sort;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 SasMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//創建一個job和任務的入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(SasMain.class);//設置mapper和reducer的入口job.setMapperClass(SasMapper.class);job.setReducerClass(SasReducer.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);}//執行jobjob.waitForCompletion(true);}
}

3.4.3?統計所有學生的信息(Si)

package student_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 SiMapper extends Mapper<LongWritable,Text,Text,Text> {@Overrideprotected void map(LongWritable Key1, Text value1,Context context) throws IOException, InterruptedException {//將文件的每一行傳遞過來,使用split分割后利用字符數組進行接收String[] splits= value1.toString().split(",");//拼接姓名+性別+年齡String name = splits[1];String sex = splits[3];String age = splits[4];String stu_info = name+"-"+sex+"-"+age;//拼接課程+成績String course = splits[0];String score = splits[2];String course_info = course+"-"+score;//向Reducer傳遞參數-> Key:姓名+性別+年齡  Value:課程+成績context.write(new Text(stu_info),new Text(course_info));}
}
package student_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 SiReducer extends Reducer<Text, Text,Text, Text> {@Overrideprotected void reduce(Text key,Iterable<Text> values,Context context)throws IOException,InterruptedException{//拼接學生各科考試成績信息String scoreInfo = "";for(Text value:values){scoreInfo = scoreInfo + value+"   ";}System.out.println("********************************************************");System.out.println(key.toString()+"\n"+scoreInfo);context.write(key,new Text(scoreInfo));}
}
package student_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 SiMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//創建job和“統計相同課程相同分數的人數”任務入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(SiMain.class);//設置Mapper和Reducer的入口job.setMapperClass(SiMapper.class);job.setReducerClass(SiReducer.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);}//執行jobjob.waitForCompletion(true);}
}

3.4.4?統計每門課程中相同分數分布情況(Css)

package course_score_same;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 CssMapper extends Mapper<LongWritable, Text,Text,Text> {@Overrideprotected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {//將文件的每一行傳遞過來,使用split分割后利用字符數組進行接收String[] stu = value.toString().split(",");//拼接字符串:課程和成績String sc = stu[0]+"\t"+stu[2];//向Reducer傳遞參數-> Key:課程+成績 Value:學生名context.write(new Text(sc),new Text(stu[1]));}
}
package course_score_same;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class CssReducer extends Reducer <Text,Text,Text,Text>{@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//創建StringBuffer用來接收該課程中成績相同的學生的姓名StringBuffer sb = new StringBuffer();//num變量用來計數int num = 0;//遍歷values參數,將所有的value拼接進sb,并統計學生數量for(Text value:values){sb.append(value.toString()).append(",");num++;}//如果num=1,則表明該課程的這個成績只有一個學生,否則就輸出if(num>1){String names = "一共有" + num + "名學生,他們的名字是:" +sb.toString();System.out.println("*************************************************");System.out.println(key.toString() + names);context.write(key,new Text(names));}}
}
package course_score_same;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 CssMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//創建job和“統計相同課程相同分數的人數”任務入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(CssMain.class);//設置Mapper和Reducer的入口job.setMapperClass(CssMapper.class);job.setReducerClass(CssReducer.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);}//執行jobjob.waitForCompletion(true);}
}

3.4.5?統計各性別的人數及他們的姓名(Snn)

package sex_number_name;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 SnnMapper extends Mapper<LongWritable, Text,Text,Text> {@Overrideprotected void map(LongWritable key, Text value,Context context) throws IOException, InterruptedException {//將文件的每一行傳遞過來,使用split分割后利用字符數組進行接收String[] stu = value.toString().split(",");//向Reducer傳遞參數-> Key:性別 Value:姓名context.write(new Text(stu[3]),new Text(stu[1]));}
}
package sex_number_name;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;public class SnnReducer extends Reducer<Text,Text,Text,Text> {@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {//創建集合來去除重復值(HashSet不允許重復值的存在,故可用來去重)List<String> names= new ArrayList<>();for (Text value:values){names.add(value.toString());}HashSet<String> singleNames = new HashSet(names);//創建StringBuffer用來接收同性別學生的姓名StringBuffer sb = new StringBuffer();//拼接學生姓名以及統計人數int num = 0;for(String singleName:singleNames){sb.append(singleName.toString()).append(",");num++;}//輸出String result = "生一共有" + num + "名,他們的名字是:" +sb.toString();System.out.println("********************************************");System.out.println(key.toString() + result);context.write(key,new Text(result));}
}
package sex_number_name;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 SnnMain {public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException, URISyntaxException {//創建job和“統計相同課程相同分數的人數”任務入口Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(SnnMain.class);//設置Mapper和Reducer的入口job.setMapperClass(SnnMapper.class);job.setReducerClass(SnnReducer.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);}//執行jobjob.waitForCompletion(true);}
}

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> {@Overrideprotected 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> {@Overrideprotected 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);}//執行jobjob.waitForCompletion(true);}
}

4 運行

5 改進

????????至此一個完整的基于mapreduce的學生成績分析系統就算是基本完成了,當然完成的功能還是十分的基礎。如果想要追求進階操作,可以嘗試使用多重處理,即把一個甚至多個mapreduce處理得到的結果當做是一個數據集,對該結果繼續進行mapreduce分析。如果有意愿還可以再進一步分析,反正越分析越詳細,這可能就是你課設比別人突出的部分,是一個大大的加分項。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535151.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535151.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535151.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【單位換算】存儲單位(bit Byte KB MB GB TB PB EB ZB YB BB)時間單位(ms μs ns ps)長度單位(dm cm mm μm nm pm fm am zm ym)

存儲單位 相鄰單位相差2?&#xff0c;記憶時可以此類推 一字節等于八比特 1 Byte 8 bit 1KB 1024 B 2? B 1MB 1024 KB 2? B 1GB 1024 MB 2? B 1TB 1024 GB 2?? B 1PB 1024 TB 2?? B 1EB 1024 PB 2?? B 1ZB 1024 EB 2?? B 1YB 1024 ZB 2?? B 1B…

Git 的安裝、使用、分支、命令 一篇博客全都學會

目錄 1 版本控制 1.1 什么是版本控制 1.2 為什么需要版本控制 2 Git概述 2.1 Git的工作機制 2.2 分布式版本控制工具與集中式的區別 2.3 Git是如何誕生的 3 Git的安裝 4 Git常用命令 4.1 用戶簽名的設置和修改 4.2 查看用戶簽名的設置 4.3 初始化本地庫 4.4 添加、…

生成一個GitHub的token用于git推送本地庫至遠程庫

1 一步步選擇設置 2 使用鏈接直接跳轉到最后一步的設置頁 git push 的時候需要token&#xff0c;所以在GitHub上生成一個臨時的token 1 一步步選擇設置 2 使用鏈接直接跳轉到最后一步的設置頁 前提是你已經在這個瀏覽器上登陸了GitHub https://github.com/settings/tokens

都2021年了,還不會使用GitHub創建、推送、拉取、克隆遠程庫、團隊協作開發?

1 對自己的遠程庫操作 1.1 在GitHub上創建遠程庫 1.2 推送本地庫至遠程庫 1.3 拉取遠程庫到本地庫 1.4 克隆遠程倉庫到本地 2 對別人的遠程庫兩種操作方式 2.1 使用GitHub進行團隊內協作開發 2.2 使用GitHub進行跨團隊協作開發 眾所周知&#xff0c;GitHub是一個大型的國…

2021 最新 IDEA集成Gitee、Gitee遷移GitHub【圖文講解】

1 創建遠程庫 2 IDEA集成Gitee 2.1 安裝gitee插件并綁定賬號 2.2 IDEA推送本地庫至遠程庫的兩種方式 2.3 修改后推送本地庫至遠程庫 2.4 拉取遠程庫 2.5 使用IDEA克隆遠程庫 3 Gitee遷移GitHub的遠程庫的兩種方式 3.1 自己的賬戶之間遷移 3.2 使用鏈接進行遷移 3.3 強制刷…

只需五步學會Maven 3.6.1OR 3.6.3及其他版本的下載安裝與配置【圖文詳解】

第一步&#xff0c;下載并解壓縮包 ?第二步&#xff0c;配置兩個環境變量 ?第三步&#xff0c;測試是否安裝成功 ?第四步&#xff0c;指定本地倉庫的路徑 第五步&#xff0c;修改鏡像倉庫 第一步&#xff0c;下載并解壓縮包 Maven官方下載地址&#xff1a;https://mav…

只需四步完成java JDK1.8的下載安裝與配置【圖文詳解】

第一步&#xff0c;下載安裝包并安裝 第二步&#xff0c;安裝JDK 第三步&#xff0c;配置三個環境變量 第四步&#xff0c;測試是否安裝成功 第一步&#xff0c;下載安裝包并安裝 Oracle的官方下載地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#ja…

從Maven中央倉庫網站下載jar包的兩種方式,將會伴隨java后端開發者的整個職業生涯

這個肥腸重要的網站就是&#xff1a;https://mvnrepository.com/ 下面我會以mysql-connector-java-8.0.26.jar為例&#xff0c;教會你使用兩種方式下載使用jar包資源 首先在搜索欄使用全稱或者是關鍵字對jar包進行搜索 選擇你想要的版本 方式一&#xff1a;導入pom文件依賴(…

2021 使用IDEA創建并編寫你的第一個Maven項目【圖文詳解】

1 使用IDEA創建你的第一個Maven項目 2 使用IDEA編寫一個Maven項目 1 使用IDEA創建你的第一個Maven項目 新建一個空白項目 File-->New-->Project-->Empty Project 在IDEA中配置JDK 在IDEA中配置Maven 新建一個Maven模塊 在test目錄下面新建一個resources文件夾 2 使…

能讓你的Intellij IDEA 起飛的幾個設置(設置背景 字體 快捷鍵 鼠標懸停提示 提示忽略大小寫 取消單行顯示)

1 設置主題(背景圖片) 2 設置字體 2.1 設置默認的字體及其大小、行間距**墻裂推薦** 2.2 設置字體大小可以隨意改變**墻裂推薦** 3 設置鼠標懸停提示 4 提示的時候忽略大小寫**墻裂推薦** ??5 取消單行顯示tabs**墻裂推薦** 6 修改類頭的文檔注釋信息 7 設置項目文…

控制臺:Unable to import maven project: See logs for details日志:Unable to create injector, see the follow

問題描述&#xff1a; 當我在使用IDEA 完成一個Maven項目的時候&#xff0c;在第一步的pom.xml文件導入依賴時就發生了這個問題&#xff0c;彈窗彈出Uable to import maven project 控制臺報 Unable to import maven project: See logs for details的異常。 既然人家都讓查看l…

Maven基礎教程

1 Maven簡介 2 Maven基礎概念 2.1 倉庫 2.2 坐標 3 依賴的相關知識點 4 生命周期與插件 5 使用Inteli idea完成第一個Maven項目 1 Maven簡介 Maven的本質就是一個項目管理工具&#xff0c;用于將項目開發和管理過程抽象成一個項目對象模型(project object model POM) Ma…

java實現編輯距離算法(levenshtein distance),計算字符串或者是文本之間的相似度【附代碼】

編輯距離算法其實就是&#xff0c;在規定的編輯操作(替換字符串、插入字符串、刪除字符串)中&#xff0c;經過幾步可以把一個字符串變成另一個字符串&#xff0c;而這個所需的步數就是你的編輯距離。 測試樣例&#xff1a; str1 abc str2 yabd 表里的每一個值都代表著將s…

【Java從入門到頭禿專欄 】(一)學在Java語法之前

目錄 1 初識Java 2 Java環境JDK 3 Java規范 1 初識Java Java是美國的sun(Stanford University Network)公司在1995年推出的一門計算機高級編程語言&#xff0c;雖然說當時參與開發Java的人員有好幾名&#xff0c;但是業內公認的Java之父是詹姆斯高斯林(James Gosling)。 Jav…

【Java從入門到頭禿專欄 】(二) 注釋 數據類型 變量 常量 關鍵字 標識符 運算符 輸入輸出

目錄 1 注釋 2 數據類型 3 變量與常量 4 關鍵字、標識符 5 運算符 6 鍵入值、輸出值 1 注釋 注釋就是寫在程序中對代碼進行解釋說明的文字&#xff0c;方便自己和其他人查看&#xff0c;以便大家更加容易理解程序。注釋雖然寫在程序中&#xff0c;但是并不參與程序的執行&#…

【Java從入門到頭禿專欄 】(三) 控制流程 Math Date DateFormat Calendar System BigDecimal Random

目錄 1 控制流程 2 Math類 3 Date類 4 DateFormat類 5 Calendar類(日歷類) 6 System類 7 BigDecimal類 8 Random類(隨機數) 1 控制流程 1.1 塊作用域 塊(即復合語句)就是指由若干條Java語句組成的語句&#xff0c;并用一條大括號括起來&#xff0c;并借此形式確定了變量…

IntelliJ IDEA最常用的一些快捷鍵,學會了室友還以為你在祖安對線

目錄 1 快速生成語句 1.1 main語句 1.2 輸出語句 1.3 流程控制語句 1.3.1 if判斷語句 1.3.2 while循環 1.3.3 for循環 1.3.4 數組、集合的循環操作 1.3.5 迭代器循環操作 1.4 對象實例化、定義變量 1.5 try-catch異常 2 快捷鍵 2.1 Ctrl系列 2.2 alt系列 2.2.1…

【Java從入門到頭禿專欄 6】語法篇(五) :多線程 線程池 可見、原子性 并發包 Lambda表達式

目錄 1 多線程 1.1 基本概念 1.2 創建線程的三種方式 1.4 解決線程安全問題的三種方法 1.5 線程通信 1.6 線程狀態 2 線程池 2.1線程池的概念 2.2 創建并提交任務 3 可見性 3.1 變量不可見性 3.2 變量不可見性的解決方案 4 原子性 4.1 原子性的概念 4.2 保證原…

【Java從入門到頭禿專欄 7】語法篇(六) :Lambda表達式(->) 方法引用(::) stream流

目錄 1 Lambda表達式( -> ) ? 2 方法引用( :: ) 3 Stream流 接下來介紹的三種語法叫&#xff1a;Lambda表達式 方法引用 stream流&#xff0c;這三種語法的使用要有特定條件&#xff0c;在一定條件下借助這三種語法可以使代碼十分簡單且優雅&#xff0c;但是不要舍本逐末…

【Java從入門到頭禿專欄 4】語法篇(三) :字符串 數組

目錄 1 String字符串 2 數組 1 String字符串 Java沒有內置的字符串類型&#xff0c;而是在Java類庫中提供了一個預定義類--String。 在Java中把每一個使用雙引號括起來的字符串都看做是String類的一個實例化對象。 String常被稱作是不可變字符串類型&#xff0c;那么有人就有…