#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 {