Как бинировать значения в маппере?

Я новичок в Hadoop MapReduce и недавно столкнулся с проблемой, связанной с биннингом выходных значений в преобразователе. Мой преобразователь создает вывод Text, IntWritable с идентификатором набора данных в качестве ключа и длиной описания метаданных в качестве значения. Моя цель состоит в том, чтобы разделить частоты длины метаданных на 3 группы: 1-200 символов, 201-400 символов и 401+ символов. Выходной файл выглядит следующим образом (первый столбец — ключ, второй столбец — значение — длина метаданных):

1   256
2   344
3   234
4   160
5   432
6   121
7   551
8   239
9   283
10   80
...

На основе приведенных выше значений результат биннинга должен отображаться:

1-200     3
201-400   5
401-...   2

Любые идеи о том, как подойти к нему? Должен ли я делать это как очистку Mapper, Combiner или в Reducer? Приветствуются примеры кода или ссылки на другие онлайн-источники. Спасибо.


person simtim    schedule 04.11.2015    source источник


Ответы (1)


Известно, что данные должны быть объединены в три ячейки. Эти бины могут быть объявлены статически в Mapper, например:

Text BIN1 = new Text("1-200");     // bin-1
Text BIN2 = new Text("200-400");   // bin-2
Text BIN3 = new Text("400-...");   // bin-3

Теперь создайте HashMap<Text, Integer> map на карте. Когда Mapper считывает данные, он обновляет счетчик для соответствующего bin в файле map. Затем напишите это map в методе cleanup(). Выход Mapper — Text и IntWritable (это количество для каждого бина из map).

Если в задании несколько картографов, то выходные данные Mapper могут быть объединены в Reducer с простой суммой значений Iterable<IntWritable> для каждого ключа (Text).

person YoungHobbit    schedule 04.11.2015