大数据学习:学生排序

news/2024/11/25 7:36:53/

文章目录

      • 一、提出任务
      • 二、任务过程
        • (一)准备数据
          • 1、在虚拟机上创建文本文件
          • 2、上传文件到HDFS指定目录
        • (二)实现步骤
          • 1、创建Maven项目
          • 2、添加相关依赖
          • 3、创建日志属性文件
          • 4、创建学生实体类
          • 5、创建学生映射器类
          • 5、创建学生归并器类
          • 6、创建学生驱动器类
          • 7、启动学生驱动器类,查看结果

一、提出任务

  • 使用MR,学生信息按年龄降序排列结果

二、任务过程

(一)准备数据

  • 启动hadoop服务
    在这里插入图片描述
1、在虚拟机上创建文本文件
  • 创建sortstudent目录,在里面创建student.txt文件
    在这里插入图片描述
2、上传文件到HDFS指定目录
  • 创建/sortstudent/input目录
  • 命令:hdfs dfs -mkdir -p /sortstudent/input
    在这里插入图片描述
  • 将文本文件student.txt,上传到HDFS的/sortstudent/input目录
    在这里插入图片描述

(二)实现步骤

1、创建Maven项目
  • Maven项目:SortStudent
    在这里插入图片描述
2、添加相关依赖
  • pom.xml文件里添加hadoopjunit依赖
    在这里插入图片描述
<dependencies>                                      <!--hadoop客户端-->                                <dependency>                                    <groupId>org.apache.hadoop</groupId>        <artifactId>hadoop-client</artifactId>      <version>3.3.4</version>                    </dependency>                                   <!--单元测试框架-->                                   <dependency>                                    <groupId>junit</groupId>                    <artifactId>junit</artifactId>              <version>4.13.2</version>                   </dependency>                                   
</dependencies>                                     
3、创建日志属性文件
  • resources目录里创建log4j.properties文件
log4j.rootLogger=ERROR, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/sortstudent.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
4、创建学生实体类
  • net.xxr.mr包里创建Student
    在这里插入图片描述
  • 为了让学生按照年龄排序,需要让学生实体类实现一个序列化可比较接口 : WritableComparable,这个接口有三个抽象方法要我们去实现
package net.xxr.mr;import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;/*** 功能:学生实体类*      实现序列化可比较接口* 作者:xxr* 日期:2022年12月17日*/
public class Student implements WritableComparable<Student> {private String name;private String gender;private int age;private String phone;private String major;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", gender='" + gender + '\'' +", age=" + age +", phone='" + phone + '\'' +", major='" + major + '\'' +'}';}public int compareTo(Student o) {return o.getAge() - this.getAge(); // 降序}public void write(DataOutput out) throws IOException {out.writeUTF(name);out.writeUTF(gender);out.writeInt(age);out.writeUTF(phone);out.writeUTF(major);}public void readFields(DataInput in) throws IOException {name = in.readUTF();gender = in.readUTF();age = in.readInt();phone = in.readUTF();major = in.readUTF();}
}
5、创建学生映射器类
  • net.xxr.mr里创建StudentMapper
    在这里插入图片描述
package net.xxr.mr;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** 功能:学生映射器类* 作者:xxr* 日期:2022年12月17日*/
public class StudentMapper extends Mapper<LongWritable, Text, Student, NullWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {// 获取行内容String line = value.toString();// 按空格拆分得到字段数组String[] fields = line.split(" ");// 获取学生信息String name = fields[0];String gender = fields[1];int age = Integer.parseInt(fields[2]);String phone = fields[3];String major = fields[4];// 创建学生对象Student student = new Student();// 设置学生对象属性student.setName(name);student.setGender(gender);student.setAge(age);student.setPhone(phone);student.setMajor(major);// 写入键值对<student,null>context.write(student, NullWritable.get());}
}
5、创建学生归并器类
  • net.xxr.mr包里创建StudentReducer
    在这里插入图片描述
package net.xxr.mr;import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;/*** 功能:学生归并器类* 作者:xxr* 日期:2022年12月17日*/
public class StudentReducer extends Reducer<Student, NullWritable, Text, NullWritable> {@Overrideprotected void reduce(Student key, Iterable<NullWritable> values, Context context)throws IOException, InterruptedException {// 获取学生对象Student student = key;// 拼接学生信息String studentInfo = student.getName() + "\t"+ student.getGender() + "\t"+ student.getAge() + "\t"+ student.getPhone() + "\t"+ student.getMajor();// 写入键值对<studentInfo,null>context.write(new Text(studentInfo), NullWritable.get());}
}
6、创建学生驱动器类
  • net.xxr.mr包里创建StudentDriver
    在这里插入图片描述
package net.xxr.mr;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.NullWritable;
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.net.URI;/*** 功能:学生驱动器类* 作者:xxr* 日期:2022年12月17日*/
public class StudentDriver {public static void main(String[] args) throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 获取作业实例Job job = Job.getInstance(conf);// 设置作业启动类job.setJarByClass(StudentDriver.class);// 设置Mapper类job.setMapperClass(StudentMapper.class);// 设置map任务输出键类型job.setMapOutputKeyClass(Student.class);// 设置map任务输出值类型job.setMapOutputValueClass(NullWritable.class);// 设置Reducer类job.setReducerClass(StudentReducer.class);// 设置reduce任务输出键类型job.setOutputKeyClass(Student.class);// 设置reduce任务输出值类型job.setOutputValueClass(NullWritable.class);// 定义uri字符串String uri = "hdfs://master:9000";// 创建输入目录Path inputPath = new Path(uri + "/sortstudent/input");// 创建输出目录Path outputPath = new Path(uri + "/sortstudent/output");// 获取文件系统FileSystem fs =  FileSystem.get(new URI(uri), conf);// 删除输出目录(第二个参数设置是否递归)fs.delete(outputPath, true);// 给作业添加输入目录(允许多个)FileInputFormat.addInputPath(job, inputPath);// 给作业设置输出目录(只能一个)FileOutputFormat.setOutputPath(job, outputPath);// 等待作业完成job.waitForCompletion(true);// 输出统计结果System.out.println("======统计结果======");FileStatus[] fileStatuses = fs.listStatus(outputPath);for (int i = 1; i < fileStatuses.length; i++) {// 输出结果文件路径System.out.println(fileStatuses[i].getPath());// 获取文件系统数据字节输入流FSDataInputStream in = fs.open(fileStatuses[i].getPath());// 将结果文件显示在控制台IOUtils.copyBytes(in, System.out, 4096, false);}}
}
7、启动学生驱动器类,查看结果
  • 运行StudentDriver 类
    在这里插入图片描述
  • 确实学生信息按照年龄降序排列了,但是做了一件我们不需要的去重,少了3条记录
  • 需要修改学生归并器类,遍历值迭代器,这样就不会去重了
    在这里插入图片描述
  • 再次运行StudentDriver 类
    在这里插入图片描述

http://www.ppmy.cn/news/4343.html

相关文章

uni-app卖座电影多端开发纪实(三):MVC

@引子 这一部分就与纯Vue开发毫无二致了!这里分别用mock数据和真实后台数据举例@数据层开发(mock) 准备一个mock数据 mock/cinemas.json {"status": 0,"data": {"cinemas": [{"cinemaId":

nodejs+vue高校教室管理系统

摘 要 1 1 系统概述 4 1.1研究背景 4 1.2研究现状 4 1.3主要内容 5 2 系统开发环境 6 2.3 MySql数据库 6 2.4 B/S结构 7 3 需求分析 8 3.1技术可行性&#xff1a;技术背景 8 3.2经济可行性 8 3.3操作可行性 8 3.4系统设计规则 9 3.5系统流程和逻辑 9 4系统概要设计 13 4.1 概…

堆/栈/队列的相关算法

前言&#xff1a;\textcolor{Green}{前言&#xff1a;}前言&#xff1a; &#x1f49e;本专栏用于本人刷算法的过程。主要包含刷题中的感受以及知识点缺陷。对于学习者来说可以作为参考。 目前更新的算法内容会比较多&#xff0c;很多都是通过刷题来进行知识点的总结&#xff0…

Java的JDBC编程

作者&#xff1a;~小明学编程 文章专栏&#xff1a;MySQL 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 什么是JDBC&#xff1f; 如何下载并且使用数据库驱动包&#xff1f; JDBC的实战用法 什么是JDBC&#xff1f; JDBC&#xff0c;即Java Datab…

计算机毕业设计springboot+vue基本微信小程序的疫情防控平台系统

项目介绍 当今社会疫情防控平台是必不可少的,大家都在听从政府的号召在居家隔离,不管是在城市还是在乡镇、农村,这引起我的注目,设计一套社区疫情防控系统,疫情防控需要大家共同努力、团结对社区居民进行了新型冠状病毒肺炎防控知识普及和宣传教育。针对这一需求,本文设计并实现…

CS61A Lab 6

更好的阅读体验 Lab 6: Object-Oriented Programming lab06.zip What Would Python Do? These questions use inheritance. For an overview of inheritance, see the inheritance portion of Composing Programs. Q1: WWPD: Classy Cars Below is the definition of a C…

数据聚合、数据同步

文章目录数据聚合Bucket聚合语法聚合结果排序限定聚合范围Metric聚合语法RestAPI实现聚合数据同步发送MQ消息接收MQ消息数据聚合 Bucket聚合语法 GET /hotel/_search {"size": 0, // 设置size为0&#xff0c;结果中 不包含文档&#xff0c;只包含聚合结果~"…

行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

根据BehaviorTree.CPP的官方介绍&#xff0c;3.x版本已经不再维护了&#xff0c;建议使用4.x版本&#xff0c; 4.x版本和3.x版本的区别可以看这里 — https://www.behaviortree.dev/migration 本文介绍4.x版本的编译及使用&#xff0c;环境是Debian 10.5&#xff0c;编译器是…