当前位置: 首页 > news >正文

使用Hadoop MapReduce实现各省学生总分降序排序,根据省份分出输出到不同文件

使用Hadoop MapReduce实现各省学生总分降序排序,根据省份分出输出到不同文件

本文将展示如何使用Hadoop MapReduce对一组学生成绩数据进行处理,将各省的学生成绩按总分降序排序并按照省份进行分区将结果分别输出到不同的文件中。

数据样例

我们将使用以下格式的数据:
在这里插入图片描述

实现步骤

我们将通过以下步骤来实现这一目标:

**1、Mapper类:**解析每一行数据,提取省份和总分,并输出为键值对。
**2、Reducer类:**对每个省份的数据按总分降序排序后输出到相应的文件中。
**3、Partitioner类:**确保同一省份的数据被发送到同一个Reducer。
**4、Driver类:**配置并运行MapReduce作业。

代码实现

Mapper类
Mapper类将每一行数据解析为省份和总分,并输出为键值对,键是省份,值是总分和学生信息的组合。

package org.example.mapReduce;import java.io.IOException;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;public class ProvinceScoreMapper extends Mapper<Object, Text, Text, Text> {@Overrideprotected void map(Object key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();// Skip the header lineif (line.startsWith("考号")) {return;}String[] fields = line.split(" ");String province = fields[11];String totalScore = fields[10];context.write(new Text(province), new Text(totalScore + "," + line));}
}

Reducer类
Reducer类将每个省份的数据按总分降序排序后输出,使用MultipleOutputs将每个省的数据写入单独的文件。

package org.example.mapReduce;import java.io.IOException;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;public class ProvinceScoreReducer extends Reducer<Text, Text, Text, Text> {private MultipleOutputs<Text, Text> multipleOutputs;@Overrideprotected void setup(Context context) throws IOException, InterruptedException {multipleOutputs = new MultipleOutputs<>(context);}@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {List<String> students = new LinkedList<>();for (Text val : values) {students.add(val.toString());}// Sort students by total score in descending orderCollections.sort(students, (a, b) -> {int scoreA = Integer.parseInt(a.split(",")[0]);int scoreB = Integer.parseInt(b.split(",")[0]);return Integer.compare(scoreB, scoreA);});for (String student : students) {String[] parts = student.split(",", 2);multipleOutputs.write(new Text(parts[1]), null, key.toString() + "/part");}}@Overrideprotected void cleanup(Context context) throws IOException, InterruptedException {multipleOutputs.close();}
}

Partitioner类
Partitioner类确保同一省份的数据被发送到同一个Reducer。

package org.example.mapReduce;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;public class ProvincePartitioner extends Partitioner<Text, Text> {@Overridepublic int getPartition(Text key, Text value, int numPartitions) {String province = key.toString();return (province.hashCode() & Integer.MAX_VALUE) % numPartitions;}
}

Driver类
Driver类配置并运行MapReduce作业。

package org.example.mapReduce;import org.apache.hadoop.conf.Configuration;
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 org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;public class ProvinceScoreSorter {public static void main(String[] args) throws Exception {if (args.length != 2) {System.err.println("Usage: ProvinceScoreSorter <input path> <output path>");System.exit(-1);}Configuration conf = new Configuration();Job job = Job.getInstance(conf, "Province Score Sorter");job.setJarByClass(ProvinceScoreSorter.class);job.setMapperClass(ProvinceScoreMapper.class);job.setPartitionerClass(ProvincePartitioner.class);job.setReducerClass(ProvinceScoreReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);FileInputFormat.addInputPath(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));MultipleOutputs.addNamedOutput(job, "province", FileOutputFormat.class, Text.class, Text.class);System.exit(job.waitForCompletion(true) ? 0 : 1);}
}

运行MapReduce作业

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

通过以上步骤,我们实现了一个Hadoop MapReduce作业来对各省的学生总分进行降序排序,并将结果写入不同的文件中。

如有遇到问题可以找小编沟通交流哦。另外小编帮忙辅导大课作业,学生毕设等。不限于MapReduce, MySQL, python,java,大数据,模型训练等。 hadoop hdfs yarn spark Django flask flink kafka flume datax sqoop seatunnel echart可视化 机器学习等
在这里插入图片描述

http://www.lryc.cn/news/370547.html

相关文章:

  • LeetCode | 66.加一
  • Oracle最终会扼杀MySQL?(译)
  • 分布式物联网平台特点
  • 【学习笔记】Linux文件编译调试相关(问题未解决)
  • 微信小程序毕业设计-驾校管理系统项目开发实战(附源码+论文)
  • 【多线程】进程与线程
  • 【文献阅读】一种多波束阵列重构导航抗干扰算法
  • 前端传递bool型后端用int收不到
  • 巴伦在接收链路中的应用
  • React常见面试题(2024最新版)
  • 【万方数据库爬虫简单开发(自用)】
  • 新渠道+1!TDengine Cloud 入驻 Azure Marketplace
  • 自动化压测工具开发(MFC)
  • 【嵌入式DIY实例】-Nokia 5110显示DHT11/DHT22传感器数据
  • C# —— 字符串拼接
  • css3新增的伪类有哪些
  • 低代码开发:企业供应链数字化的挑战与应对
  • 线程池的创建与使用
  • C++ 中的负无穷大赋值
  • python实现九九乘法表
  • 【已解决】chrome视频无法自动播放的问题
  • 为什么要分析电商用户数据?详解两大用户数据分析维度
  • Linux系统的FTP文件传输服务
  • redis 08 慢查询日志
  • 山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(三十一)- 微服务(11)
  • DevExpress WPF中文教程:Grid - 如何向项目添加GridControl并绑定到数据
  • nodejs湖北省智慧乡村旅游平台-计算机毕业设计源码00232
  • 架构设计 - 根据性能压力测试结果优化服务器性能
  • 【必会面试题】事务的四大特性?ACID
  • 【QT】记录一次QT程序发布exe过程