Hadoop之MapReduce-T1

本文介绍了一个使用Hadoop MapReduce实现的学生数据处理案例,通过MapReduce框架统计每个班级年龄最小和最大的学生及其姓名,并计算各班级的总人数。文章详细展示了Map和Reduce阶段的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

班级学生数据处理分析

Hadoop之MapReduce-T1

概要模式

关于概要模式:

总的来说,就是通过对数据进行汇总和分组得到一个顶层视图。对于海量的用户数据,概要分析是将相似数据分组到一起并执行类似统计计算、索引生成或者简单计数等后续的分析操作。计算基于分组的聚合是从数据集中抽取有价值信息的有效方法,举个例子,一家线上店铺分析人员希望得到店铺在不同地区不同城市的盈利总额。通常典型的场景是,对于一份数据集,概要分析来发现有吸引力的指标,独特的数据,以及需要进一步分析的某些维度。概要模式要更接近简单的MapReduce应用,因为基于键将数据分组是Mapreduce范型的核心功能:所有的键被分组并汇总在reducer中。


以下是本次任务的内容

一、任务目标

统计出每个班级中年龄最小和最大对应的同学以及这个班的总人数。
输出格式为:
班级号 年龄最小日期 对应人姓名 年龄最大日期 对应人姓名 班级总人数
源数据如图(部分):
在这里插入图片描述

二、处理代码

1.Map部分

关键代码如下:

public static class Map extends Mapper<LongWritable,Text,Text, Text> {
        Text k = new Text();
        Text v = new Text();
        
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

        	String line = new String(value.getBytes(),0,value.getLength(),"GBK");
            //对空行数据进行过滤           
    		if (value.toString().trim().length() > 0) {
                String[] strings = value.toString().split(",");
    			
             //获取班级、出生时间(yyyyMMdd)、姓名
             String classes = strings[0];
             int birthday = Integer.parseInt(strings[1].split(" ")[0].replace("-", ""));
             String name = strings[2];

              //以班级作为键,按照不同班级写入reduce
                k.set(classes);
                v.set(birthday+"_"+name);
                context.write(k, v);
            }
        }
    }

2.Reduce部分

关键代码如下:

public static class Reduce extends Reducer<Text, Text, Text, Text> {
        Text k = new Text();
        Text v = new Text();

        ArrayList<String> arrayList = new ArrayList<>();
        
        protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {

          //获取班级
          String classes = key.toString();
          //数据写入到arrayList
          for (Text value : values)
              arrayList.add(value.toString());
          //获取班级人数
           int classNum = arrayList.size();
          //按照birthday排序
            arrayList.sort(new Comparator<String>() {
                
                public int compare(String o1, String o2) {
                    return Integer.parseInt(o1.split("_")[0]) - Integer.parseInt(o2.split("_")[0]);
                }
            });
         //获取最小最大birthday
            String minStu = arrayList.get(0);
            String maxStu = arrayList.get(arrayList.size() - 1);
         //输出
            k.set(classes);
            v.set(minStu + "\t" + maxStu + "\t" + classNum);
            context.write(k, v);
         //清空该班级的arrayList
            arrayList.clear();
        }
    }

过程在注释里阐明


总结

本次任务首先是对数据做一个排空处理,然后定义我们需要的班级,日期,姓名,以班级作为键k,以日期加姓名作为值v<k,v>,输出到reduce,reduce部分首先是对班级人数做统计,然后按日期排序获取最小最大日期,最后按相应格式输出。输出结果如下图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y?Ire: TO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值