У меня есть два очень больших набора данных (таблицы) на 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.
Большое спасибо.
Генри, благодарю вас за ответ. Но как я могу отделить их, не забрав их в память? – digitalmert
@digitalmert, я думаю, что значения уже извлечены в память, поскольку все они существуют в Списке. Вы имеете в виду, что ваши оба файла огромны, а мощность ключа соединения очень мала, и это может вызвать ошибку OOM даже с фиктивным редуктором? –
Да. Поскольку значение ключа соединения может включать в себя много строк из обоих файлов, значение может не вписываться в память. Для ключа x значение может включать миллионы строк из других таблиц. Если я попытаюсь извлечь строки из одной таблицы в память, то перекрестное производство, это может вызвать ошибку в памяти. По причинам масштабируемости я не хочу этого делать. Есть ли способ, который вы можете предложить для этого случая? – digitalmert