1. 程式人生 > >mapreduce計算平均值

mapreduce計算平均值

當我們有每一位同學的每一科成績時,我們計算他們的平均成績,用傳統的方法比較麻煩,如果我們用hadoop中MapReduce元件的話就比較簡單了。
測試資料如下:
僅用於測試的資料
從上面的資料可以看到,計算每一位同學的平均成績,在map階段,我們可以用同學的姓名作為key,成績作為value;在reduce階段,key值相同的value值相加計算出總成績,並且計算出科目的數量,然後用總成績來除以科目數量就可以得出每一位同學的平均成績了。
程式碼如下:

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;

public
class Socre { public static class Map extends Mapper<Object,Text,Text,IntWritable>{ public void map(Object key,Text value,Context context){ //把讀入的每一行轉換為String String line=value.toString(); //以“\n”切分資料 StringTokenizer tokenizer=new StringTokenizer(line,"\n"
); while(tokenizer.hasMoreElements()){ //以空格切分資料 StringTokenizer tokenizerLine=new StringTokenizer(tokenizer.nextToken()); //獲取姓名 String nameString=tokenizerLine.nextToken(); //獲取成績 String scoreString=tokenizerLine.nextToken(); int
scoreInt=Integer.parseInt(scoreString); try { //key:姓名,value:成績 context.write(new Text(nameString),new IntWritable(scoreInt)); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } } public static class Reduce extends Reducer<Text,IntWritable,Text,IntWritable>{ public void reduce(Text key,Iterable<IntWritable> values,Context context){ //計算給同學的總成績 int sum=0; //獲取科目數目 int count=0; Iterator<IntWritable> iterable=values.iterator(); while(iterable.hasNext()){ sum+=iterable.next().get(); count++; } int avg=(int)sum/count; try { context.write(key,new IntWritable(avg)); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws IllegalArgumentException, IOException, ClassNotFoundException, InterruptedException{ Configuration conf = new Configuration(); Job job = new Job(conf); job.setJarByClass(Socre.class); job.setJobName("avgscore1"); job.setMapperClass(Map.class); job.setReducerClass(Reduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("/avgscoreinput")); FileOutputFormat.setOutputPath(job, new Path("/avgscoreoutput")); job.waitForCompletion(true); } }

執行結果:
這裡寫圖片描述
程式還是有沒有考慮到的情況,比如成績時小數的話,應該用double或float來定義變數,但是該程式只是提供一個演算法思想。