Написание кода MApreduce для подсчета количества записей

Я хочу написать код mapreduce для подсчета количества записей в данном CSV-файле. Я не понимаю, что делать с картой и что делать с сокращением, как мне решить эту проблему, может ли кто-нибудь что-нибудь предложить?


person chhaya vishwakarma    schedule 12.02.2012    source источник


Ответы (5)


Ваш преобразователь должен выдавать фиксированный ключ (просто используйте текст со значением "count") и фиксированное значение 1 (такое же, как вы видите в примере с количеством слов).

Затем просто используйте LongSumReducer в качестве вашего редуктора.

Результатом вашей работы будет запись с ключом «количество», а значением является количество записей, которые вы ищете.

У вас есть возможность (значительно!) улучшить производительность, используя тот же LongSumReducer в качестве объединителя.

person Niels Basjes    schedule 12.02.2012
comment
спасибо за ваш ответ, не могли бы вы рассказать мне, что такое LongSumReducer и чем он отличается от обычного редуктора? - person chhaya vishwakarma; 13.02.2012
comment
LongSumReducer — это простая реализация редуктора, которая делает именно то, что вам нужно. Так что вам не нужно писать его самостоятельно. Я добавил URL-адрес в документацию в своем ответе. - person Niels Basjes; 13.02.2012
comment
не могли бы вы рассказать мне, как использовать LongSumReducer? Можете ли вы предоставить мне фрагмент кода, который мне поможет? - person chhaya vishwakarma; 14.02.2012
comment
Этот код тривиален, когда вы просто пытаетесь написать его самостоятельно. Ознакомьтесь с учебным пособием по Hadoop ( developer.yahoo.com/hadoop/tutorial/module4.html ) или хорошую книгу по Hadoop и попробуйте написать ее самостоятельно. Это не сайт, на котором делают домашние задания другие люди. - person Niels Basjes; 14.02.2012

  • Ваша карта должна выдавать 1 для каждой прочитанной записи
  • ваш объединитель должен выдать сумму всех «1», которые он получил (под итог на карту)
  • ваш редуктор должен выдать общее количество записей
person Arnon Rotem-Gal-Oz    schedule 12.02.2012

Надеюсь, у меня есть лучшее решение, чем принятый ответ.

Вместо того, чтобы выдавать 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);

 }
}

Вы можете найти полный рабочий код здесь.

person USB    schedule 11.12.2015
comment
Элегантное и эффективное решение. - person tlarchuk; 22.11.2017

Используйте job.getcounters() для получения значений, которые вы увеличили для каждой записи после завершения задания. Если вы используете java для написания задания mapreduce, используйте enum для механизма подсчета.

person user3378430    schedule 01.04.2014

Я бы просто использовал Картограф идентичности и Редуктор идентичности.

Это Mapper.class и Reducer.class. Тогда просто прочитайте map input records

Вам действительно не нужно делать никакого кодирования, чтобы получить это.

person Marc    schedule 17.11.2015