使用idea编写hadoop 2020年研究生招生考试分数线统计 2020年高校考研平均分数线充计2020年考研各专业平均分数线统计2020年考研各高校开放专业数量统计 搜索某所大学的所有专业以及分数线,进行排名
时间: 2023-09-09 20:11:13 浏览: 99
以下是使用IDEA编写Hadoop实现对2020年研究生招生考试分数线统计、2020年高校考研平均分数线统计、2020年考研各专业平均分数线统计、2020年考研各高校开放专业数量统计以及搜索某所大学的所有专业以及分数线,进行排名的步骤:
1. 准备数据
需要准备包含研究生招生考试分数线、高校考研平均分数线、考研各专业平均分数线、考研各高校开放专业数量以及各高校各专业的分数线信息的数据文件。文件格式根据需要进行设计。
2. 创建Hadoop项目
在IDEA中创建一个新的Maven项目,并添加hadoop的依赖。
3. 编写Mapper类
根据需要进行设计,Mapper类负责将数据按照一定的规则进行切分和处理,以便后续的Reducer类进行统计。具体代码如下:
```java
public class ScoreMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
private Text outKey = new Text();
private IntWritable outValue = new IntWritable();
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] tokens = value.toString().split(" ");
outKey.set(tokens[0]);
outValue.set(Integer.parseInt(tokens[1]));
context.write(outKey, outValue);
}
}
```
4. 编写Reducer类
根据需要进行设计,Reducer类负责接收Mapper类输出的数据,并进行相应的统计。具体代码如下:
```java
public class ScoreReducer extends Reducer<Text, IntWritable, Text, DoubleWritable> {
private DoubleWritable outValue = new DoubleWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
int count = 0;
for (IntWritable value : values) {
sum += value.get();
count++;
}
double average = (double) sum / count;
outValue.set(average);
context.write(key, outValue);
}
}
```
5. 配置Job并运行
在主函数中配置Job的相关参数,并将Mapper和Reducer类设置到Job中。具体代码如下:
```java
public class ScoreJob {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "ScoreJob");
job.setJarByClass(ScoreJob.class);
job.setMapperClass(ScoreMapper.class);
job.setReducerClass(ScoreReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
```
其中,args[0]代表输入文件路径,args[1]代表输出文件路径。最后,运行该程序即可得到相应的统计结果。
对于搜索某所大学的所有专业以及分数线,进行排名,可以编写一个独立的程序,读取包含所有数据的文件,根据需要进行处理并输出结果。具体代码如下:
```java
public class ScoreRank {
public static void main(String[] args) throws IOException {
String file = args[0];
String university = args[1];
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
Map<String, Integer> scores = new HashMap<>();
Map<String, List<String>> universities = new HashMap<>();
while ((line = br.readLine()) != null) {
String[] tokens = line.split(" ");
String name = tokens[0];
String universityName = name.split("-")[0];
int score = Integer.parseInt(tokens[1]);
if (!universities.containsKey(universityName)) {
List<String> majors = new ArrayList<>();
majors.add(name);
universities.put(universityName, majors);
} else {
List<String> majors = universities.get(universityName);
majors.add(name);
universities.put(universityName, majors);
}
scores.put(name, score);
}
List<String> majors = universities.get(university);
majors.sort((o1, o2) -> scores.get(o2) - scores.get(o1));
for (int i = 0; i < majors.size(); i++) {
String major = majors.get(i);
int score = scores.get(major);
System.out.println(String.format("%d. %s: %d", i + 1, major, score));
}
}
}
```
其中,args[0]代表包含所有数据的文件路径,args[1]代表需要搜索的大学名称。运行该程序即可得到该大学所有专业以及分数线的排名结果。
阅读全文