班级学生数据处理分析
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部分首先是对班级人数做统计,然后按日期排序获取最小最大日期,最后按相应格式输出。输出结果如下图: