복붙노트

[HADOOP] 파일 당 카운트와 단어 수 예

HADOOP

파일 당 카운트와 단어 수 예

내가 파일 당 단어의 발생의 총 수의 붕괴를 얻기 위해 문제가 발생하고있다. 예를 들어, 나는 네 개의 텍스트 파일 (T1, T2, T3, T4)가 있습니다. 단어 W1 세의 총 발생으로, 파일 T2에 두 번, 그리고 한 번 T4있다. I 출력 파일에 동일한 정보를 작성합니다. 나는 각 파일의 단어 수를 얻고있다,하지만 난 위와 같이 원하는 결과를 얻을 수 없습니다.

여기 내지도 클래스입니다.

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
//line added
import org.apache.hadoop.mapreduce.lib.input.*;

public class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
private String pattern= "^[a-z][a-z0-9]*$";

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    String line = value.toString();
    StringTokenizer tokenizer = new StringTokenizer(line);
    //line added
    InputSplit inputSplit = context.getInputSplit();
    String fileName = ((FileSplit) inputSplit).getPath().getName();

    while (tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken());
        String stringWord = word.toString().toLowerCase();
        if ((stringWord).matches(pattern)){
            //context.write(new Text(stringWord), one);
            context.write(new Text(stringWord), one);
            context.write(new Text(fileName), one);
            //System.out.println(fileName);
            }
        }
    }
}

해결법

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

    1.이것은 당신은 값으로 키와 파일 이름으로 단어를 작성하여 얻을 수 있습니다. 이제 감속기의 각 파일에 대한 별도의 카운터를 초기화하고 업데이트합니다. 모든 값이 특정 키에 대한 반복되면, 다음 컨텍스트에 각 파일에 대한 카운터를 작성합니다.

    이것은 당신은 값으로 키와 파일 이름으로 단어를 작성하여 얻을 수 있습니다. 이제 감속기의 각 파일에 대한 별도의 카운터를 초기화하고 업데이트합니다. 모든 값이 특정 키에 대한 반복되면, 다음 컨텍스트에 각 파일에 대한 카운터를 작성합니다.

    여기에 당신은 당신이 네 개의 파일이 있는지 알고 있습니다, 그래서 당신은 할 수있는 하드 코드 네 개의 변수입니다. 당신이 감속기에서 처리하는 각각의 새로운 키에 대한 변수를 재설정해야 기억하십시오.

    경우 파일의 수는지도를 사용할 수있는 다음 추가하는 경우. 지도에서, 파일 이름은 열쇠가 될 것입니다 및 값을 업데이트 계속.

  2. ==============================

    2.매퍼의 출력에서 ​​우리는 키와 텍스트 파일 이름과 값으로 파일의 각 행을 설정할 수 있습니다. 이 감속기는 당신에게 파일 이름 단어와 그에 대응하는 수를 제공합니다.

    매퍼의 출력에서 ​​우리는 키와 텍스트 파일 이름과 값으로 파일의 각 행을 설정할 수 있습니다. 이 감속기는 당신에게 파일 이름 단어와 그에 대응하는 수를 제공합니다.

    public class Reduce extends Reducer<Text, Text, Text, Text> {
        HashMap<String, Integer>input = new HashMap<String, Integer>();
    
        public void reduce(Text key, Iterable<Text> values , Context context)
        throws IOException, InterruptedException {
            int sum = 0;
            for(Text val: values){
                String word = val.toString(); -- processing each row
                String[] wordarray = word.split(' '); -- assuming the delimiter is a space
                for(int i=0 ; i<wordarray.length; i++)
               {
                if(input.get(wordarray[i]) == null){
                input.put(wordarray[i],1);}
                else{
                 int value =input.get(wordarray[i]) +1 ; 
                 input.put(wordarray[i],value);
                 }
               }     
    
           context.write(new Text(key), new Text(input.toString()));
        }
    
  3. from https://stackoverflow.com/questions/32969870/wordcount-example-with-count-per-file by cc-by-sa and MIT license