MapReduce案例学习(2) 求各个部门的人数和平均工资
2015-09-20 15:55
555 查看
设计思路:
map阶段:map读取每行记录,将部门作为key,工资作为value输出;
reduce阶段:将相同的key即同部门的工资作叠加运算得出总工资,同时在遍历value时,定义一个计数变量,统计该部门的人员数,最后总工资除以人员数得出该部门的平均工资。
map阶段:map读取每行记录,将部门作为key,工资作为value输出;
reduce阶段:将相同的key即同部门的工资作叠加运算得出总工资,同时在遍历value时,定义一个计数变量,统计该部门的人员数,最后总工资除以人员数得出该部门的平均工资。
package week06; import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configured; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.*; import org.apache.hadoop.mapreduce.*; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; // 2) 求各个部门的人数和平均工资 public class Emp_Test2 extends Configured implements Tool { /** * 计数器 用于计数各种异常数据 */ enum Counter { LINESKIP, } /** * MAP任务 */ public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { @Override public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString();// 每行文件 // 输入文件首行,不处理 if (line.contains("empno") == true) { return; } Employee emp = Employee.parser(line); if (emp.isValid()) { context.write(new Text(emp.getDname()), new IntWritable(emp.getSal())); } else { context.getCounter(Counter.LINESKIP).increment(1); // 出错令计数器+1 return; } } } /** * REDUCE任务 */ public static class Reduce extends Reducer<Text, IntWritable, Text, Text> { @Override public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { float sum = 0; int num = 0; for (IntWritable value : values) { num += 1; sum += value.get(); } float sal = sum / num; context.write(key, new Text("--人数:"+num + "--平均工资:" + sal)); } } public int run(String[] args) throws Exception { Configuration conf = getConf(); conf.set("mapred.job.tracker", "192.168.1.201:9001"); String[] ioArgs = new String[] { "emp_in", "emp_out_test2" }; String[] otherArgs = new GenericOptionsParser(conf, ioArgs) .getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: Test < input path > < output path >"); System.exit(2); } Job job = new Job(conf, "week06_test_02"); // 任务名 job.setJarByClass(Emp_Test2.class); // 指定Class FileInputFormat.addInputPath(job, new Path(otherArgs[0])); // 输入路径 FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); // 输出路径 job.setMapperClass(Map.class); // 调用上面Map类作为Map任务代码 job.setReducerClass(Reduce.class);// 调用上面Reduce类作为Reduce任务代码 job.setOutputKeyClass(Text.class); // 指定输出的KEY的格式 job.setOutputValueClass(IntWritable.class); // 指定输出的VALUE的格式 job.waitForCompletion(true); // 输出任务完成情况 System.out.println("任务名称:" + job.getJobName()); System.out.println("任务成功:" + (job.isSuccessful() ? "是" : "否")); System.out.println("输入行数:" + job.getCounters() .findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_INPUT_RECORDS").getValue()); System.out.println("输出行数:" + job.getCounters() .findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue()); System.out.println("跳过的行:" + job.getCounters().findCounter(Counter.LINESKIP).getValue()); return job.isSuccessful() ? 0 : 1; } /** * 设置系统说明 设置MapReduce任务 */ public static void main(String[] args) throws Exception { // 记录开始时间 DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date start = new Date(); // 运行任务 int res = ToolRunner.run(new Configuration(), new Emp_Test2(), args); // 输出任务耗时 Date end = new Date(); float time = (float) ((end.getTime() - start.getTime()) / 60000.0); System.out.println("任务开始:" + formatter.format(start)); System.out.println("任务结束:" + formatter.format(end)); System.out.println("任务耗时:" + String.valueOf(time) + " 分钟"); System.exit(res); } }
相关文章推荐
- adt-bundle-windows-x86_64-20130522.zip 下载
- CTEX 报错“font ccicons at 480 not found” 解决方法
- RadioButton设置了checked属性 运行后 一直选中的问题
- 安装win7和Ubuntu双系统后,win7耳机没声音,外放有声音
- NSCFArray insertObject:atIndex:]: mutating method sent to immutable obje的解决方法
- uva 136(Ugly Numbers, 优先队列基础)
- 软工实践练习一— —个人
- hadoop的example中的wordcount运行示例
- #pragma简介及常见用法
- 基于mfc下的俄罗斯方块程序设计
- unity UGUI text font size对性能影响较大
- C++技术点积累(6)——异常处理、输入和输出流
- markdown学习小记
- IOS-Excel表格制作
- Javascript学习笔记【第四章】
- 斯蒂芬森的
- spring技术内幕之spring mvc
- Deepin安装ibus.
- o9.15冒泡排序
- 对Git的认识