Как создать пользовательский файл с уникальным именем на этапе редуктора Hadoop Map Reduce Framework(в Python))
Я написал один код для редуктора, который будет читать вывод из картографа. И тогда он создаст новый файл с именем ключа, и все значения, соответствующие одному и тому же ключу, будут сохранены в одном файле.
Мой код:
!/usr/bin/env python
import sys
last_key = None #initialize these variables
for input_line in sys.stdin:
input_line = input_line.strip()
data = input_line.split("\t")
this_key = data[0]
if len(data) == 2:
value = data[1]
else:
value = None
if last_key == this_key:
if value:
fp.write('{0}\n'.format(value))
else:
if last_key:
fp.close()
fp = open('%s.txt' %this_key,'a')
if value:
fp.write('{0}\n'.format(value))
if not last_key:
fp = open('%s.txt' %this_key,'a')
if value:
fp.write('{0}\n'.format(value))
last_key = this_key
Но это не создание какого-либо файла.
Итак, у меня вопрос, какую функцию мне нужно использовать для создания новых файлов в HDFS.
1 ответ
Не существует простого решения для достижения этой цели. Вы можете использовать следующие подходы для достижения этой цели с помощью Mapreduce:
Подход 1: Использование разделителя
- Узнайте уникальное количество файлов.eg подсчитайте уникальное количество "%this_key%" в файле.
- Установите число редукторов для результата предыдущего шага в драйвере mapreduce [каждый файл на редуктор].
- Используйте секционер для отправки вывода карты конкретному редуктору.
- Редуктор испускает только% значение%.
- В конце работы у вас будет одинаковое значение ключа для каждого файла, и вы можете переименовать выходные файлы редуктора.
Подход 2: если количество файлов очень мало, используйте MultipleOutputs.