Получение чисел в примере подсчета слов в гадупе в клоудере - PullRequest
1 голос
/ 08 ноября 2019

Ниже мы использовали код: класс карты - WCMapper. класс редукции - WCReducer.

Не совсем уверен, почему вывод генерирует число вместо wordcount.

public class WCMapper extends Mapper { 
    public void map(LongWritable key,Text value,Context context) throws 
    IOException,InterruptedException 
       { String line = key.toString(); 
        StringTokenizer tokenizer = new StringTokenizer(line); 
          while(tokenizer.hasMoreTokens()) 
          { value.set(tokenizer.nextToken()); 
           context.write(value, new IntWritable(1)); 
            }
            }

       }

 public class WCReducer extends Reducer<Text,IntWritable,Text,IntWritable>{
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException,InterruptedException
{
    int sum=0;
    for(IntWritable x: values)
    {
        sum+=x.get();

    }

    result.set(sum);
    System.out.println("Key: "+key+"Value: "+sum);
    context.write(key, result);

}
   }    



public static void main(String[] args) throws Exception{
    Configuration conf = new Configuration();

    Job job = Job.getInstance(conf, "WordCount");

    job.setJarByClass(WorCount.class);
    job.setMapperClass(WCMapper.class);
    job.setReducerClass(WCReducer.class);

    job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);

    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);

     Path outputPath = new Path(args[1]);

     FileInputFormat.addInputPath(job, new Path(args[0]));
     FileOutputFormat.setOutputPath(job, new Path(args[1]));

     outputPath.getFileSystem(conf).delete(outputPath, true);

     System.exit(job.waitForCompletion(true)? 0: 1);
}

Входной файл: это cloudera Это умно

Ожидаетсявывод: это 2 клудера 1 умный 1

вывод получен: 0 1 17 1

1 Ответ

0 голосов
/ 08 ноября 2019

Проблема в вашем преобразователе:

String line = key.toString();

key в этом случае - LongWritable, представляющее смещение байта строки в файле. Если вы измените эту строку на value, а затем не используете value ниже, вы получите правильный ответ.

Новый картограф:

public void map(LongWritable key, Text value, Context context) throws IOException,InterruptedException { 
    String line = value.toString(); 
    StringTokenizer tokenizer = new StringTokenizer(line); 
    Text word = new Text();

    while(tokenizer.hasMoreTokens()) {
        word.set(tokenizer.nextToken()); 
        context.write(word, new IntWritable(1)); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...