Я хочу написать код mapreduce для подсчета количества записей в данном CSV-файле. Я не понимаю, что делать с картой и что делать с сокращением, как мне решить эту проблему, может ли кто-нибудь что-нибудь предложить?
Написание кода MApreduce для подсчета количества записей
Ответы (5)
Ваш преобразователь должен выдавать фиксированный ключ (просто используйте текст со значением "count") и фиксированное значение 1 (такое же, как вы видите в примере с количеством слов).
Затем просто используйте LongSumReducer в качестве вашего редуктора.
Результатом вашей работы будет запись с ключом «количество», а значением является количество записей, которые вы ищете.
У вас есть возможность (значительно!) улучшить производительность, используя тот же LongSumReducer в качестве объединителя.
- Ваша карта должна выдавать 1 для каждой прочитанной записи
- ваш объединитель должен выдать сумму всех «1», которые он получил (под итог на карту)
- ваш редуктор должен выдать общее количество записей
Надеюсь, у меня есть лучшее решение, чем принятый ответ.
Вместо того, чтобы выдавать 1 для каждой записи, почему бы нам просто не увеличивать счетчик в map() и выдавать увеличенный счетчик после каждой задачи карты в cleanup().
Промежуточные операции чтения и записи могут быть уменьшены. А редюсеру нужно только агрегировать список из нескольких значений.
public class LineCntMapper extends
Mapper<LongWritable, Text, Text, IntWritable> {
Text keyEmit = new Text("Total Lines");
IntWritable valEmit = new IntWritable();
int partialSum = 0;
public void map(LongWritable key, Text value, Context context) {
partialSum++;
}
public void cleanup(Context context) {
valEmit.set(partialSum);
context.write(keyEmit, valEmit);
}
}
Вы можете найти полный рабочий код здесь.
Используйте job.getcounters() для получения значений, которые вы увеличили для каждой записи после завершения задания. Если вы используете java для написания задания mapreduce, используйте enum для механизма подсчета.
Я бы просто использовал Картограф идентичности и Редуктор идентичности.
Это Mapper.class и Reducer.class. Тогда просто прочитайте map input records
Вам действительно не нужно делать никакого кодирования, чтобы получить это.