Hadoop outputCollector

#hadoop

#hadoop

Вопрос:

У меня есть программа mapreduce, и она работает нормально, ниже приведены подписи функций map и reduce. В настоящее время outputcollector

 output.collect(newtext, new IntWritable(someintegervalue like 5)); //works ok
  

Мне нужно изменить это, чтобы обрабатывать / выводить двойные значения. (необходимо разделить два целых числа, чтобы получить результат, который является двойным).
Я попытался изменить outputcollector следующим образом

output.collect(newtext, new DoubleWritable(somedoublevalue like 5.1))

и при компиляции / запуске возникают проблемы. Надеемся минимизировать изменения в Map и уменьшить подписи, поскольку программа работает нормально, нужно только получить вывод в двойном формате вместо целых чисел.

Ниже приведены текущие подписи Map Reduce и работают нормально.

 class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> 

map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException

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 {
  

Комментарии:

1. «при компиляции / запуске возникают проблемы» — каковы они?

2. Я попытался изменить outputcollector следующим образом output.collect(newtext, new DoubleWritable(somedoublevalue, например 5.1)) он жалуется на несовместимость подписи редуктора. Мне нужно получить свой вывод в виде double, а не целых чисел (что в настоящее время работает нормально).

Ответ №1:

Не забывайте, что вам необходимо указать выходные классы при настройке задания, например, вам нужно будет написать:

 conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(DoubleWritable.class);
  

В противном случае он будет жаловаться следующим образом:

 "type mismatch value from map: expected org.apache.hadoop.io.IntWritable,
 recieved org.apache.hadoop.io.DoubleWritable"
  

Ответ №2:

Из вашего комментария кажется, что вы не везде изменили подпись. Вам необходимо изменить их на следующие:

 class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, DoubleWritable> 

map(LongWritable key, Text value, OutputCollector<Text, DoubleWritable> output, Reporter reporter) throws IOException

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

public void reduce(Text key, Iterator<DoubleWritable> values, OutputCollector<Text, DoubleWritable> output, Reporter reporter) throws IOException {