请选择 进入手机版 | 继续访问电脑版

MapReduce---计数器的使用

[复制链接]
时间苍白了等待 发表于 2021-1-2 17:40:29 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
MapReduce---计数器的使用



需求及数据



  • 数据
  A,40,70,78
B,27,30,84
C,73,88,78
D,75,29,44
E,93,85,15
F,21,4,77
G,50,11,62
H,3,64,18
I,75,31,3
J,38,88,23
K,75,79,26
L,87,69,69
M,45,15,43
N,49,63,82
O,57,44,12
P,59,8,38
Q,40,68,3
R,78,18,75
S,79,47,21
T,19,45,79
U,84,5,30
V,67,80,64
W,87,22,11
X,11,51,68
Y,88,25,33
Z,31,60,22
字段分别对应姓名,语文效果,数学效果,英语效果


  • 需求
    统计各科合格与不合格的人数,按总效果降序排序
代码实现

自界说Student类

自界说对象来存储数据
  1. import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;import java.io.DataOutput;import java.io.IOException;public class Student implements WritableComparable {    private String name;    private int chinese;    private int math;    private int english;    private int sum;    public int compareTo(Student o) {        if (o.sum - this.sum == 0) {            return o.chinese - this.chinese;        }        return o.sum - this.sum;    }    public void write(DataOutput dataOutput) throws IOException {        dataOutput.writeUTF(name);        dataOutput.writeInt(chinese);        dataOutput.writeInt(math);        dataOutput.writeInt(english);        dataOutput.writeInt(sum);    }    public void readFields(DataInput dataInput) throws IOException {        name = dataInput.readUTF();        chinese = dataInput.readInt();        math = dataInput.readInt();        english = dataInput.readInt();        sum = dataInput.readInt();    }    public void set(String name, int chinese, int math, int english) {        this.name = name;        this.chinese = chinese;        this.math = math;        this.english = english;        this.sum = chinese+math+english;    }    @Override    public String toString() {        return name+"\t"+chinese+"\t"+math+"\t"+english+"\t"+sum;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getChinese() {        return chinese;    }    public void setChinese(int chinese) {        this.chinese = chinese;    }    public int getMath() {        return math;    }    public void setMath(int math) {        this.math = math;    }    public int getEnglish() {        return english;    }    public void setEnglish(int english) {        this.english = english;    }    public int getSum() {        return sum;    }    public void setSum(int sum) {        this.sum = sum;    }}
复制代码
编写Map类

  1. 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;public class MapTest extends Mapper {    Student k = new Student();    @Override    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {        String datas [] = value.toString().split(",");        if (Integer.parseInt(datas[1])>=60){            context.getCounter("品级","语文合格").increment(1);        }else {            context.getCounter("品级","语文不合格").increment(1);        }        if (Integer.parseInt(datas[2])>=60){            context.getCounter("品级","数学合格").increment(1);        }else {            context.getCounter("品级","数学不合格").increment(1);        }        if (Integer.parseInt(datas[3])>=60){            context.getCounter("品级","英语合格").increment(1);        }else {            context.getCounter("品级","英语不合格").increment(1);        }        k.set(datas[0],Integer.parseInt(datas[1]),Integer.parseInt(datas[2]),Integer.parseInt(datas[3]));        context.write(k,NullWritable.get());    }}
复制代码
编写DriTest

  1. import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.Path;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.File;public class DriTest {    public static void main(String[] args) throws Exception {        File file = new File("D:\\MP\\counter\\output");        if (file.exists()) {            delFile(file);            driver();        } else {            driver();        }    }    public static void delFile(File file) {        File[] files = file.listFiles();        if (files != null && files.length != 0) {            for (int i = 0; i < files.length; i++) {                delFile(files[i]);            }        }        file.delete();    }    public static void driver() throws Exception {        Configuration conf = new Configuration();        Job job = Job.getInstance(conf);        job.setMapperClass(MapTest.class);        job.setJarByClass(DriTest.class);        //job.setReducerClass(RedTest.class);        job.setMapOutputKeyClass(Student.class);        job.setMapOutputValueClass(NullWritable.class);        // job.setOutputKeyClass(Student.class);        // job.setOutputValueClass(NullWritable.class);        FileInputFormat.setInputPaths(job, "D:\\MP\\counter\\input");        FileOutputFormat.setOutputPath(job, new Path("D:\\MP\\counter\\output"));        boolean b = job.waitForCompletion(true);        System.exit(b ? 0 : 1);    }
复制代码
效果



来源:https://blog.csdn.net/heiren_a/article/details/112003514
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )