Пытаюсь посчитать вероятность появления каждой буквы в файле с помощью программы Map-reduce.
Я использую следующую структуру для уменьшения карты. 1 сопоставитель для сопоставления всех символов, например ('a', 1). 1 объединитель для вычисления общего количества вхождений каждого символа. 1 редуктор для вычисления среднего.
Однако я не могу вычислить среднее значение в редукторе. Итак, я добавил фиктивный символ, который будет записан один раз всякий раз, когда новый символ отображается картографом.
Этот фиктивный символ представляет собой общее количество символов, я не знаю, как получить к нему доступ в редюсере и разделить все остальные значения на общее количество.
Например, ниже приведены выходные данные объединителя.
# 10
a 2
b 2
c 2
d 4
Я пробовал с 1 редуктором, который не дает результата.
Мне особенно нужно знать логику, которая должна быть написана в редюсере.
public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
throws IOException, InterruptedException {
int wordCount = 0;
double total = 1;
System.out.println("In Reducer now!");
double avg = 0;
total = values.iterator().next().get();
avg = values.get() / total;
context.write(key, new DoubleWritable(avg));
}
Приведенный выше код ничего не записывает на выходе.
Картограф
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String s = value.toString();
char[] arrayofChar = s.toCharArray();
for (char ch : arrayofChar) {
System.out.print(ch);
if (Character.isLetter(ch)) {
context.write(new Text(String.valueOf(ch)), new DoubleWritable(1));
context.write(new Text("#"), new DoubleWritable(1));
}
}
}
Комбайнер
public void reduce(Text key, Iterable<DoubleWritable> values, Context context)
throws IOException, InterruptedException {
double total = 0;
System.out.println("In Combiner now!");
for (DoubleWritable value : values) {
total += value.get();
}
context.write(key, new DoubleWritable(total));
}