2016-03-17 5 views
2

Мне было предложено изменить пример WordCount так, чтобы каждая функция-манипулятор суммировала вхождения слов в файл вместе, прежде чем передавать его. Так, например, вместо:Hadoop WordCount, сумма на карте

<help,1> 
<you,1> 
<help,1> 
<me,1> 

Выход преобразователя будет:

<help,2> 
<you,1> 
<me,1> 

Так бы я добавить слово в массив, а затем проверить вхождения? Или есть более простой способ?

String line = value.toString(); 
StringTokenizer tokenizer = new StringTokenizer(line); 
while (tokenizer.hasMoreTokens()) { 
    word.set(tokenizer.nextToken()); 
    context.write(word, one); 
} 

ответ

1

Вы можете определить структуру Java Map или гуавы Multiset и сосчитайте вхождения каждого слова для каждого Mapper. Затем, когда преобразователь заканчивается, метод очистки, который работает после этого, может излучать все частичные суммы как выход карты, как и (псевдокод):

setup() { 
    Map<String,Integer> counts = new HashMap<>(); 
} 

map() { 
    for each word w { 
     counts.put(w, counts.get(w)+1); //or 1, if counts.get(w) returns null 
    } 
} 

cleanup() { 
    for each key w of counts.keySet { 
     context.write(w, counts.get(w)); 
    } 
} 

со ссылкой на Mapper's documentation (версия 2.6.2):

Рамка Hadoop Map-Reduce создает одну задачу карты для каждого InputSplit, сгенерированного InputFormat для задания. Реализации Mapper могут получить доступ к Конфигурации для задания через JobContext.getConfiguration().

Структура сначала вызывает настройку (org.apache.hadoop.mapreduce.Mapper.Context), а затем карту (объект, объект, контекст) для каждой пары ключ/значение в InputSplit. Наконец вызывается очистка (Context).

Кроме этого, вы также можете рассмотреть возможность использования Combiner в качестве альтернативы.

+0

Меня интересует ваш ответ. Могу ли я узнать, где хранится этот мультимайл? Я имею в виду, что эта функция карты работает на нескольких ПК правильно? – AchmadJP

+0

@AchmadJP Я на самом деле имел в виду Multiset. Я обновил свой ответ перед вашим комментарием. Не путайте структуру данных, такую ​​как Multiset, Multimap или java Map с методом map() MapReduce. Они совершенно разные. Пожалуйста, прочитайте документацию Multiset, которую я предоставляю в качестве ссылки в своем ответе. Я надеюсь, что это помогает. Таким образом, если вы не смущены, эти структуры данных сохраняются только в памяти каждого устройства отображения и удаляются впоследствии; они не записываются на диск в любое время. – vefthym

+1

Ваши объяснения очень хорошие. Пожалуйста, подумайте о том, чтобы вставить свой комментарий в свой ответ, если это выбрано в качестве ответа. – AchmadJP

Смежные вопросы