복붙노트

[HADOOP] 하둡 단어 개수 : 문자 "C"로 시작하는 단어의 수를받을

HADOOP

하둡 단어 개수 : 문자 "C"로 시작하는 단어의 수를받을

Heres는 하둡 단어는 자바지도를 계산하고 소스 코드를 줄일 수 :

지도 기능, 난에 왔 어디에 출력 할 수있는 문자 "C"또한 그 단어가 나타납니다 총 횟수로 시작하지만, 난 할 노력하고있어 것은 바로 출력에게 총을 모든 단어를 하지만 문자 "C"로 시작하는 단어 나는 총 number.Any의 도움을 받고에 조금 주시면 감사하겠습니다 붙어있어, 감사합니다.

내가 갖는 것을 내 출력 :

수 2

수 3

고양이 5

나는 얻으려고 무엇 :

C-총 10

public static class MapClass extends MapReduceBase
   implements Mapper<LongWritable, Text, Text, IntWritable> {

private final static IntWritable one = new IntWritable(1);
private Text word = new Text();

public void map(LongWritable key, Text value,
                OutputCollector<Text, IntWritable> output,
                Reporter reporter) throws IOException {
  String line = value.toString();
  StringTokenizer itr = new StringTokenizer(line);
  while (itr.hasMoreTokens()) {
    word.set(itr.nextToken());
    if(word.toString().startsWith("c"){
    output.collect(word, one);
   }
  }
 } 
}


public static class Reduce extends MapReduceBase
implements Reducer<Text, IntWritable, Text, IntWritable> {

public void reduce(Text key, Iterator<IntWritable> values,
                   OutputCollector<Text, IntWritable> output,
                   Reporter reporter) throws IOException {
  int sum = 0;
  while (values.hasNext()) {
    sum += values.next().get(); //gets the sum of the words and add them together
  }
  output.collect(key, new IntWritable(sum)); //outputs the word and the number
  }
 }

해결법

  1. ==============================

    1.크리스 Gerken의 대답은 권리입니다.

    크리스 Gerken의 대답은 권리입니다.

    당신이 당신의 열쇠로 말을하고 출력하기 경우 그것은 단지 당신이 "C"로 시작하는 독특한 단어의 수를 계산하는 데 도움이 될 것입니다

    "C"의 모든 총 수입니다.

    그에 대한 그래서 당신은 출력 매퍼에서 고유 키가 필요합니다.

     while (itr.hasMoreTokens()) {
                String token = itr.nextToken();
                if(token.startsWith("c")){
                    word.set("C_Count");
                    output.collect(word, one);
                }
    
            }
    

    여기에 새로운 API를 사용하는 예입니다

    드라이버 클래스

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    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.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
    
    public class WordCount {
    
        public static void main(String[] args) throws Exception {
            Configuration conf = new Configuration();
    
            Job job = new Job(conf, "wordcount");
            FileSystem fs = FileSystem.get(conf);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            if (fs.exists(new Path(args[1])))
                fs.delete(new Path(args[1]), true);
            job.setMapperClass(Map.class);
            job.setReducerClass(Reduce.class);
    
            job.setInputFormatClass(TextInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
    
            FileInputFormat.addInputPath(job, new Path(args[0]));
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            job.setJarByClass(WordCount.class);     
            job.waitForCompletion(true);
        }
    
    }
    

    매퍼 클래스

    import java.io.IOException;
    import java.util.StringTokenizer;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
    
    public class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
    
        public void map(LongWritable key, Text value, Context context)
                throws IOException, InterruptedException {
            String line = value.toString();
            StringTokenizer itr = new StringTokenizer(line);
            while (itr.hasMoreTokens()) {
                String token = itr.nextToken();
                if(token.startsWith("c")){
                    word.set("C_Count");
                    context.write(word, one);
                }
    
            }
        }
    }
    

    감속기 클래스

    import java.io.IOException;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    public class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
    
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            context.write(key, new IntWritable(sum));
        }
    }
    
  2. ==============================

    2.대신에

    대신에

    output.collect(word, one);
    

    당신의 매퍼에, 시도 :

    output.collect("c-total", one);
    
  3. ==============================

    3.매퍼에 대한 간단한 코드 :

    매퍼에 대한 간단한 코드 :

    public void map(LongWritable key, Text value,OutputCollector<Text,IntWritable> op, Reporter r)throws IOException
    {
        String s = value.toString();
          for (String w : s.split("\\W+"))
           {
           if (w.length()>0)
            {
             if(w.startsWith("C")){
             op.collect(new Text("C-Count"), new IntWritable(1));        
             }
           }
      }
    }
    
  4. from https://stackoverflow.com/questions/26208454/hadoop-word-count-receive-the-total-number-of-words-that-start-with-the-letter by cc-by-sa and MIT license