hadoop学习:mapreduce入门案例二:统计学生成绩

这里相较于 wordcount,新的知识点在于学生实体类的编写以及使用

数据信息:

  1. Student 实体类
java 复制代码
import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class Student implements WritableComparable<Student> {
//    Object
    private long stuid;
    private String stuName;
    private int score;

    public Student(long stuid, String stuName, int score) {
        this.stuid = stuid;
        this.stuName = stuName;
        this.score = score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuid=" + stuid +
                ", stuName='" + stuName + '\'' +
                ", score=" + score +
                '}';
    }

    public Student() {
    }

    public long getStuid() {
        return stuid;
    }

    public void setStuid(long stuid) {
        this.stuid = stuid;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    // 自动整理文件格式 ctrl + shift + f  英文输放状态
    @Override
    public int compareTo(Student o) {
        return this.score > o.score ? 1 : 0;
    }

    @Override
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeLong(stuid);
        dataOutput.writeUTF(stuName);
        dataOutput.writeInt(score);
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
        this.stuid = dataInput.readLong();
        this.stuName = dataInput.readUTF();
        this.score = dataInput.readInt();
    }
}
  1. mapper 阶段,StudentMapper 类
java 复制代码
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * 输出  key:学生id   value:Student对象
 */
public class StudentMapper extends Mapper<LongWritable, Text,LongWritable,Student> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String[] split = value.toString().split(",");
        LongWritable stuidKey = new LongWritable(Long.parseLong(split[0]));
        Student stuValue = new Student(Long.parseLong(split[0]),split[1],Integer.parseInt(split[2]));
        context.write(stuidKey,stuValue);
    }
}
  1. reduce 阶段,StudentReduce 类
java 复制代码
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

public class StudentReducer extends Reducer<LongWritable,Student,Student, NullWritable> {
    @Override
    protected void reduce(LongWritable key, Iterable<Student> values, Context context) throws IOException,
            InterruptedException {
        Student stuOut = new Student();
        int sumScore = 0;
        String stuName = "";
        for (Student stu :
                values) {
            sumScore+=stu.getScore();
            stuName = stu.getStuName();
        }
        stuOut.setScore(sumScore);
        stuOut.setStuid(key.get());
        stuOut.setStuName(stuName);
        System.out.println(stuOut.toString());
        context.write(stuOut, NullWritable.get());
    }
}
  1. 驱动类,studentDriver 类
java 复制代码
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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;

public class StudentDriver {
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf);

        job.setJarByClass(StudentDriver.class);

        //配置 job中map阶段处理类和map阶段的输出类型
        job.setMapperClass(StudentMapper.class);
        job.setMapOutputKeyClass(LongWritable.class);
        job.setMapOutputValueClass(Student.class);


        //配置 job中deduce阶段处理类和reduce阶段的输出类型
        job.setReducerClass(StudentReducer.class);
        job.setOutputKeyClass(Student.class);
        job.setOutputValueClass(NullWritable.class);

        // 输入路径配置  "hdfs://kb131:9000/kb23/hadoopstu/stuscore.csv"
        Path inpath = new Path(args[0]);  // 外界获取文件输入路径
        FileInputFormat.setInputPaths(job, inpath);
        // 输出路径配置  "hdfs://kb131:9000/kb23/hadoopstu/out2"
        Path path = new Path(args[1]);    //
        FileSystem fs = FileSystem.get(path.toUri(), conf);
        if (fs.exists(path))
            fs.delete(path,true);
        FileOutputFormat.setOutputPath(job,path);

        job.waitForCompletion(true);
    }
}
相关推荐
别动我齐刘海1 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
一直C2 小时前
嵌入式 Linux 驱动开发学习笔记:内核定时器、platform 总线与 I²C 驱动
linux·驱动开发·嵌入式硬件·学习·imx6ull
承渊政道2 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
andrsted2 小时前
练题簿免费刷题小程序:和学习搭子共用一份题库,一起刷题复习
学习·面试·微信小程序·小程序·学习方法·刷题
fqbqrr3 小时前
2610学习,ahk学习技巧
学习
fengci.3 小时前
BUUCTF(困难部分)
android·开发语言·前端·学习·php
有Li3 小时前
基于超高分辨率CT智能分割与测量的单侧梅尼埃病内耳解剖特征定量研究文献速递/医学智能体前沿
大数据·人工智能·学习·文献·医学生
Дерек的学习记录4 小时前
Unreal Engine 5:开关门实现和流程控制
开发语言·学习·ue5
辣知4 小时前
辣知·化智87 两千年前庄子的高维智慧
学习
xian_wwq4 小时前
【学习笔记-一文读懂系列】读懂GBZ-195-2026《人工智能 工业智能体参考架构》
笔记·学习