Как создать пользовательский файл с уникальным именем на этапе редуктора 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: Использование разделителя

  1. Узнайте уникальное количество файлов.eg подсчитайте уникальное количество "%this_key%" в файле.
  2. Установите число редукторов для результата предыдущего шага в драйвере mapreduce [каждый файл на редуктор].
  3. Используйте секционер для отправки вывода карты конкретному редуктору.
  4. Редуктор испускает только% значение%.
  5. В конце работы у вас будет одинаковое значение ключа для каждого файла, и вы можете переименовать выходные файлы редуктора.

Подход 2: если количество файлов очень мало, используйте MultipleOutputs.

Другие вопросы по тегам