zoukankan      html  css  js  c++  java
  • MapReduce_Score

    TEST FILES

    math.txt

    zs 80
    ls 90
    ww 95
    china.txt
    zs 60
    ls 65
    ww 90

      1 package MapReduce;
      2 
      3 import java.io.IOException;
      4 import java.net.URI;
      5 import java.util.Iterator;
      6 import java.util.StringTokenizer;
      7  
      8 import org.apache.hadoop.conf.Configuration;
      9 import org.apache.hadoop.fs.FileSystem;
     10 import org.apache.hadoop.fs.Path;
     11 import org.apache.hadoop.io.IntWritable;
     12 import org.apache.hadoop.io.LongWritable;
     13 import org.apache.hadoop.io.Text;
     14 import org.apache.hadoop.mapreduce.Job;
     15 import org.apache.hadoop.mapreduce.Mapper;
     16 import org.apache.hadoop.mapreduce.Reducer;
     17 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
     18 import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
     19 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
     20 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
     21 import org.apache.hadoop.util.GenericOptionsParser;
     22  
     23 public class Score {
     24     private static final String OUTPUT_PATH = "hdfs://h201:9000/user/hadoop/output";
     25     public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> { 
     26         // 实现map函数
     27         public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
     28             // 将输入的纯文本文件的数据转化成String
     29             String line = value.toString();
     30             // 将输入的数据首先按行进行分割
     31             StringTokenizer tokenizerArticle = new StringTokenizer(line, "
    "); 
     32             // 分别对每一行进行处理
     33             while (tokenizerArticle.hasMoreElements()) {
     34                 // 每行按空格划分
     35                 //一个分隔的嵌套,先按行截,再在这里按空格对每一行的内容截取 
     36                 StringTokenizer tokenizerLine = new StringTokenizer(tokenizerArticle.nextToken());
     37                 String strName = tokenizerLine.nextToken();// 学生姓名部分,是按顺序赋值的
     38                 String strScore = tokenizerLine.nextToken();// 成绩部分
     39  
     40                 Text name = new Text(strName);
     41                 int scoreInt = Integer.parseInt(strScore);
     42                 // 输出姓名和成绩
     43                 context.write(name, new IntWritable(scoreInt));
     44             }
     45         }
     46  
     47     }
     48  
     49     public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
     50         // 实现reduce函数
     51         public void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {
     52             int sum = 0;
     53             int count = 0;
     54  
     55             Iterator<IntWritable> iterator = values.iterator();
     56             while (iterator.hasNext()) {
     57                 sum += iterator.next().get();// 计算总分
     58                 count++;// 统计总的科目数
     59             }
     60  
     61             int average = (int) sum / count;// 计算平均成绩
     62             context.write(key, new IntWritable(average));
     63         }
     64  
     65     }
     66  
     67     public static void main(String[] args) throws Exception {
     68         Configuration conf = new Configuration();
     69         
     70         conf.set("mapred.jar","Score.jar");
     71         final FileSystem fileSystem = FileSystem.get(new URI(OUTPUT_PATH), conf);//读路径信息
     72         fileSystem.delete(new Path(OUTPUT_PATH), true);//删除路径信息 输出路径不能存在
     73         String[] ioArgs = new String[] { "hdfs://h201:9000/user/hadoop/input", "hdfs://h201:9000/user/hadoop/output" };
     74         //"score_in", "score_out"指定输入输出目录,正常应该写成{ "/user/hadoop/score_in", "/user/hadoop/score_out" }
     75         String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();
     76         // GenericOptionsParser做一个命令的解析,下面有,可解析出路径
     77         if (otherArgs.length != 2) {                        
     78             System.err.println("Usage: Score Average <in> <out>");
     79             System.exit(2);
     80         }
     81         //即如果找不到"score_in", "score_out"中的任何一个都会报错,因为数组中有"score_in", "score_out"两个成员,所以长度是2
     82  
     83         Job job = new Job(conf, "Score Average");
     84         job.setJarByClass(Score.class);
     85  
     86         // 设置Map、Combine和Reduce处理类
     87         job.setMapperClass(Map.class);
     88         job.setCombinerClass(Reduce.class);
     89         job.setReducerClass(Reduce.class);
     90  
     91         // 设置输出类型
     92         job.setOutputKeyClass(Text.class);
     93         job.setOutputValueClass(IntWritable.class);
     94  
     95         // 将输入的数据集分割成小数据块splites,提供一个RecordReder的实现
     96         job.setInputFormatClass(TextInputFormat.class);
     97         // 提供一个RecordWriter的实现,负责数据输出
     98         job.setOutputFormatClass(TextOutputFormat.class);
     99  
    100         // 设置输入和输出目录
    101         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    102         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    103         System.exit(job.waitForCompletion(true) ? 0 : 1);
    104     }
    105 }

    ********补充
    迭代器(Iterator)

      迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

      Java中的Iterator功能比较简单,并且只能单向移动:

      (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

      (2) 使用next()获得序列中的下一个元素。

      (3) 使用hasNext()检查序列中是否还有元素。

      (4) 使用remove()将迭代器新返回的元素删除。

      Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。


    1.创建集合:
    Collection c = new ArrayList<String>();
    2
    添加元素:
    c.add("hehehe");
    c.add("huhuhu");
    c.add("wawawa");
    3
    获取集合的迭代器:
    Iterator iterator = c.iterator();
    4
    进行遍历:
    while(iterator.hasNext())//如果仍有元素可以迭代,则返回 true
    {
    System.out.println(iterator.next());//返回迭代的下一个元素。
    }


    ************
    org.apache.hadoop.util包 GenericOptionsParser类【原创】

    GenericOptionsParser功能描述
       GenericOptionsParser是hadoop框架中解析命令行参数的基本类。它能够辨别一些标准的命令行参数,能够使应用程序轻易地指定namenode,jobtracker,以及其他额外的配置资源。

    parseGeneralOptions(options, conf, args)这个函数解析用户指定的参数,获取基本选项以及根据需要修改配置。它首先指定每个通用选项的属性,然后解析选项,参数,把它转化为命令行对象(CommandLine),紧接着把设定好的命令行参数写入系统配置
    ********************

  • 相关阅读:
    Day10 python基础---函数进阶
    Day9 python基础---函数初识
    Day8 python基础
    Day7 python基础
    Day6 python基础
    Day5 python基础
    Day4 python基础
    Day3 python基础
    TensorFlow学习笔记5-概率与信息论
    TensorFlow学习笔记6-数值计算基础
  • 原文地址:https://www.cnblogs.com/jieran/p/8645981.html
Copyright © 2011-2022 走看看