hadoop 平均成绩

3.1 实例描述

  对输入文件中数据进行就算学生平均成绩。输入文件中的每行内容均为一个学生姓名和他相应的成绩,如果有多门学科,则每门学科为一个文件。要求在输出中每行有两个间隔的数据,其中,第一个代表学生的姓名第二个代表其平均成绩

样本输入

1)math:

张三    88

李四    99

王五    66

赵六    77

2)china:

张三    78

李四    89

王五    96

赵六    67

3)english:

张三    80

李四    82

王五    84

赵六    86

样本输出

张三    82

李四    90

王五    82

赵六    76

3.2 设计思路

计算学生平均成绩是一个仿"WordCount"例子,用来重温一下开发MapReduce程序的流程。程序包括两部分的内容:Map部分和Reduce部分,分别实现了map和reduce的功能。

Map处理的是一个纯文本文件, 文件中存放的数据时每一行表示一个学生的姓名和他相应一科成绩。Mapper处理的数据是由InputFormat分解过的数据集,其中 InputFormat的作用是将数据集切割成小数据集InputSplit,每一个InputSlit将由一个Mapper负责处理。此 外,InputFormat中还提供了一个RecordReader的实现,并将一个InputSplit解析成<key,value>对提 供给了map函数。InputFormat的默认值是TextInputFormat,它针对文本文件,按行将文本切割成InputSlit,并用 LineRecordReader将InputSplit解析成<key,value>对,key是行在文本中的位置,value是文件中的 一行。

Map的结果会通过partion分发到Reducer,Reducer做完Reduce操作后,将通过以格式OutputFormat输出。

Mapper最终处理的结果对<key,value>,会送到Reducer中进行合并,合并的时候,有相同key的键/值对则送到同一个 Reducer上。Reducer是所有用户定制Reducer类地基础,它的输入是key和这个key对应的所有value的一个迭代器,同时还有 Reducer的上下文。Reduce的结果由Reducer.Context的write方法输出到文件中。

3.3 程序代码

程序代码如下所示:

  

package test;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class Score {

	public static class Map extends Mapper<Object, Text, Text, DoubleWritable>{
		private static Text name = new Text();
		private static DoubleWritable score = new DoubleWritable();

		protected void map(Object key, Text value, Context context)
				throws java.io.IOException ,InterruptedException {
			String[] splits = value.toString().split("\t");
			if(splits.length != 2){
				return;
			}
			name.set(splits[0]);
			score.set(Double.parseDouble(splits[1]));
			context.write(name, score);
		};
	}
	public static class Reduce extends Reducer<Text, DoubleWritable, Text, DoubleWritable>{
		private static DoubleWritable avg = new DoubleWritable();

		protected void reduce(Text name, Iterable<DoubleWritable> scores, Context context)
				throws java.io.IOException ,InterruptedException {
			double sum = 0;
			int count = 0;
			for (DoubleWritable score : scores) {
				sum += score.get();
				count++;
			}
			avg.set(sum/count);
			context.write(name, avg);
		};
	}
	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
		if(otherArgs.length != 2){
			System.err.println("Usage:Score Avg");
			System.exit(2);
		}
		Job job = new Job(conf, "Score Avg");
		job.setJarByClass(Score.class);

		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);

		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(DoubleWritable.class);

		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(DoubleWritable.class);

		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		System.exit(job.waitForCompletion(true) ? 0 : 1);
	}
}

3.4 准备测试数据

  上传数据到hdfs上,设置myeclipse的运行输入参数,运行

3.5

  输出结果,不用了吧。

  备注:文本文件的编码为"UTF-8",默认为"ANSI",可以另存为时选择,不然中文会出现乱码

参考:http://penghuaiyi.iteye.com/blog/1943464

附注:

  原文采用了(这里未使用)

  

// 将输入的数据集分割成小数据块splites,提供一个RecordReder的实现

job.setInputFormatClass(TextInputFormat.class);

// 提供一个RecordWriter的实现,负责数据输出

job.setOutputFormatClass(TextOutputFormat.class);

  这两句话不知是什么意思。起什么作用?如果您看到,可帮我解释下啦。

hadoop 平均成绩,布布扣,bubuko.com

时间: 2024-10-06 00:45:10

hadoop 平均成绩的相关文章

平均成绩

"平均成绩"主要目的还是在重温经典"WordCount"例子,可以说是在基础上的微变化版对输入文件中数据进行就算学生平均成绩.输入文件中的每行内容均为一个学生的姓名和他相应的成绩,如果有多门学科,则每门学科为一个文件.要求在输出中每行有两个间隔的数据,其中,第一个代表学生的姓名,第二个代表其平均成绩. 数据准备 amath 张三    88 李四    99 王五    66 赵六    77 achinese 张三    78 李四    89 王五    96

hdu 2023 求平均成绩 (java)

问题: 在计算列和时,没有将i j调换,导致输出错误的结果: for(int i=0;i<m;i++) { for(int j=0;j<n;j++) g[i]+=a[j][i];//错误:g[i]+=a[i][j]; g[i]=g[i]/n; 此外,定义了三个double型数组导致超出内存,实际上二维数组只需要用int型: 最后输出时没有注意要预留一个空行: 如果在同一级出现相同的for循环,要看能否组合成一个循环: 求平均成绩 Time Limit: 2000/1000 MS (Java/O

hdu 2023 求平均成绩

本题链接:点击打开链接 本题题意: 有n名学生,m门课程,输入每个学生没门课程的成绩,求每个学生的平均成绩和没门课程的平均成绩,并统计每门课程的成绩均超过该课程平均成绩的学生有多少名. 解题思路: 本题主要是使用三个数组,一个score二维数组存放每个学生每门课的成绩,然后两个一维数组student和subject分别存放每个学生的平均成绩及每门课的平均成绩.具体请参考代码: #include<stdio.h> #include<string.h> double student[5

hdoj 2023 求平均成绩

求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 74055    Accepted Submission(s): 17809 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. Input

杭电2023 求平均成绩(及一些易见的错误)

链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2023 首先,想说下,这题对我来说可能是一个阴影.因为在自己学校的程序竞赛中,这是第二题,当时自己没ac,结果那叫一个自卑啊!然后今天a题目的时候那种恐惧感又来了,很影响情绪.然后,自己现在完全通过自己的努力,但也用了起码3小时的纠错时间,将代码ac了.附上ac代码: #include <iostream> #include<math.h> #include <iomani

Java程序,求学员的平均成绩

第一步,系统提示输入学员的人数. 第二步,逐一获取学员的分数,并累计. 第三步,求平均成绩,并输出. import java.util.Scanner; public class chengji { public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println("请输入学员人数"); int renshu=s.nextInt(); int i=1; int su

awk应用-计算学生的平均成绩

让我们来看awk应用的一个例子,其中先对一系列学生的成绩进行相加,然后计算其平均值.下面是输入文件的具体数据: $ cat grades john 85 92 78 94 88 andrea 89 90 75 90 86 jasper 84 88 80 92 84 在学生的姓名后面有5个成绩.下面的脚本将给出每个学生的平均成绩: $ cat grades.awk #求5个成绩的平均值 { total = $2 + $3 + $4 + $5 + $6 avg = total / 5 print $

求平均成绩(杭电2023)(确实很水很繁琐)

求平均成绩 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 66221    Accepted Submission(s): 15805 Problem Description 假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量. Input

求平均成绩

Problem B: 求平均成绩 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 43  Solved: 6 [Submit][Status][Web Board] [Edit] [TestData] Description 班上有学生若干名,已知每名学生的成绩(整数),求班上全部学生的平均成绩.保留到小数点后两位.同一时候输出该平均成绩整数部分四舍五入后的数值. 第一行有一个整数n(1<= n <= 100),表示学生的人数.其后n行每行有1个