MapReduce编程练习题目

MapReduce练习

源数据:
Zhangsan 90 83 88
Lisi 83 76 73

Wangwu 84 81 77
Zhaoliu 77 67

Chentian 78 91 82
Liutao 83

任务:本次数据是学生数据,分别是姓名 语文成绩 数学成绩 英语成绩
在数据中,可以看出有些学生的数据只有两门,而且在数据里也出现了空行,所以本次任务是清理不符合规则的内容和空行,并且算出他的总分和平均成绩
结果输出为:姓名 总分 平均分

代码如下:

package hadoop;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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 Damon01 {
     
/*原数据
 * Zhangsan 90 83 88
Lisi 83 76 73

Wangwu 84 81 77
Zhaoliu 77 67

Chentian 78 91 82
Liutao 83
*/
	
	public static class TokenizerMapper extends Mapper<Object, Text, Text, Text>{
      
		public void map(Object key, Text value, Context context ) throws IOException, InterruptedException {
     
			//将value转换为string类型
			String str = value.toString();
			//将str内容进行分隔,并存放到ss数组李
			String[] ss= str.split(" ");
			//处理不规则的数据
			//如果数组ss的长度不为4的将其清除
			if (ss.length !=4) {
     
				
				return;
			}
			//如果数组ss长度为0是即数据为空时将其清除
			else if (ss.length ==0) {
     
				return;
			}
			//如果执行到此时,说明数据合法,并且将其进行存放
			String name = ss[0];//姓名
			String yw = ss[1];//语文成绩
			String sx = ss[2];//数学成绩
			String yy = ss[3];//英语成绩
			int iyw = Integer.valueOf(yw);//进行数据转型后的语文成绩
			int isx = Integer.valueOf(sx);//进行数据转型后的数学成绩
			int iyy = Integer.valueOf(yy);//进行数据转型后的英语成绩
			int total = isx+iyw+iyy;//总成绩
			int average = (isx+iyw+iyy) /3;//平均成绩
			String total2 = String.valueOf(total);//进行数据转型后的总成绩
			String average2 = String.valueOf(average);//进行数据转型后的平均成绩
			//由于输出类型是Text是类型,所以将数据进行转型
			//由于这里的输出方式是姓名  总成绩  平均成绩,所以下面将总成绩和平均成绩放在bb里一起输出
			Text aa = new Text();	//姓名
			aa.set(name);
		   Text bb = new Text();	//总成绩和平均成绩
		   bb.set(total2+"   "+average2);
		   
		   /*由于输出需要将总成绩进行从小到大的排序
		    *所以在这里的输出的顺序是 总成绩   平均分   姓名
		    *因为在这输出会自动将数据进行排序
		    *所以在这里我们要把总成绩和平均分作为key输出,姓名作为value输出 */
		   context.write(bb, aa);
		   
/*
 * 经过maper处理完的数据
232   77  [Lisi]	
242   80  [Wangwu]	
251   83  [Chentian]	
261   87  [Zhangsan]	

*/
		   
		   
/*需要reduce处理后的结果如下
Lisi	232   77
Wangwu	242   80
Chentian	251   83
Zhangsan	261   87
*/

		}
	}
	
	public static class IntSumReducer extends Reducer<Text,Text,Text,Text> {
      
		public void reduce(Text key, Iterable<Text> values, Context context ) throws IOException, InterruptedException {
      
			//实际上现在这个数组只有一个元素,但还是要将这个元素取出来
			
			for (Text p : values) {
     
				//由于我们需要的结果是姓名,总成绩和平均成绩
				//所以在这里输出要将map传进来的key作为values输出
				//map传进来的values作为key输出
				context.write(p, key);
				
			}
			
		}
	}
	
/*reducer处理后输出结果
Lisi	232   77
Wangwu	242   80
Chentian	251   83
Zhangsan	261   87
*/
	
	
	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: wordcount  "); 
			System.exit(2); 
		} 
		Job job = new Job(conf, "word count"); 
		job.setJarByClass(Damon01.class); 
		job.setMapperClass(TokenizerMapper.class);
		job.setReducerClass(IntSumReducer.class); 
		job.setOutputKeyClass(Text.class); 
		job.setOutputValueClass(Text.class); 
		FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
		FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); 
		System.exit(job.waitForCompletion(true) ? 0 : 1); 
	} 
}

你可能感兴趣的:(MapReduce,mapreduce,hadoop,大数据)