2014-08-31 1 views
0

У меня есть два очень больших набора данных (таблицы) на HDFS. Я хочу, чтобы присоединился к ним в некоторых столбцах, затем группировать их на некоторых столбцах, а затем выполнять некоторые групповые функции на некоторых столбцах.Итерация много раз через значение ввода текста в редукторе в задании MapReduce

Мои шаги:

1- Создание двух рабочих мест.

2- В первой работе, в преобразовател чтения строк каждого набора данных в виде карты входного значения и испускают присоединиться к значения как выходной карту ключа и остальные столбцы столбцы значений в качестве выходного значения карты.

После сопоставления каркас MapReduce выполняет перетасовку, а группы - все значения выходных данных карты в соответствии с выходными ключами карты.

Затем в редукторе он считывает каждый выходной ключ карты и его значения, которые включают в себя много строк из обоих наборов данных.

Я хочу, чтобы итерация уменьшала входное значение много раз, чтобы я мог выполнять декартово произведение.

Для иллюстрации:

Скажем, для объединения ключевых х, у меня есть 100 матчей из одного набора данных и 200 матчей от другой. Это означает, что они соединяют их по ключу соединения x производит комбинацию 100 * 200 = 20000. Я хочу испускать NullWritable как уменьшить выходной ключ и каждый декартовой продукт как уменьшить выходное значение.

Пример вывода может быть:

для присоединиться ключевые х:

Из (nullWritable), (первый (1), второй (1))

Over (nullWritable), (первый (1), второй (200))

К (nullWritable), (первый (100), второй (200))

Как я могу это сделать?

Я могу перебирать только один раз. И я не мог обналичить ценности, потому что они не вписываются в память.

3- Если я это сделаю, я запустим второе задание, которое берет первый файл результатов задания в качестве входного файла. В mapper я выделяю столбцы группы « » в качестве ключа вывода карты, а остальные значения столбцов - в качестве значения вывода. Затем в редукторе путем повторения каждого значения ключа I выполняют некоторые функции на некоторых столбцах, таких как sum, avg, max, min.

Большое спасибо.

ответ

0

С вашего первого задания на использование MR в качестве ключа выхода карты введите свой первый редуктор (K join_key, List < V>) для каждого вызова сокращения. То, что вы можете сделать, это разделить только отдельные значения на два отдельных списка, каждый для источника данных, и использовать вложенный цикл для работы с декартовым продуктом.

+0

Генри, благодарю вас за ответ. Но как я могу отделить их, не забрав их в память? – digitalmert

+0

@digitalmert, я думаю, что значения уже извлечены в память, поскольку все они существуют в Списке. Вы имеете в виду, что ваши оба файла огромны, а мощность ключа соединения очень мала, и это может вызвать ошибку OOM даже с фиктивным редуктором? –

+0

Да. Поскольку значение ключа соединения может включать в себя много строк из обоих файлов, значение может не вписываться в память. Для ключа x значение может включать миллионы строк из других таблиц. Если я попытаюсь извлечь строки из одной таблицы в память, то перекрестное производство, это может вызвать ошибку в памяти. По причинам масштабируемости я не хочу этого делать. Есть ли способ, который вы можете предложить для этого случая? – digitalmert