Как получить имя файла при запуске задания mapreduce на EC2? - PullRequest
1 голос
/ 10 ноября 2011

Я изучаю эластичное отображение карт и начал с примера Word Splitter, представленного в разделе учебника Amazon (код показан ниже). В этом примере производится подсчет слов для всех слов во всех предоставленных входных документах.

Но я хочу получить вывод для количества слов по именам файлов, то есть по количеству слов только в одном конкретном документе. Поскольку код Python для подсчета слов принимает входные данные из стандартного ввода, как узнать, какая строка ввода поступила из какого документа?

Спасибо.

#!/usr/bin/python

import sys
import re

def main(argv):
  line = sys.stdin.readline()
  pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*")
  try:
    while line:
      for word in  pattern.findall(line):
        print  "LongValueSum:" + word.lower() + "\t" + "1"
      line =  sys.stdin.readline()
  except "end of file":
    return None
if __name__ == "__main__":
  main(sys.argv)

1 Ответ

5 голосов
/ 10 ноября 2011

В типичном примере WordCount имя файла, который обрабатывает файл карты, игнорируется, поскольку выходные данные задания содержат общее количество слов для всех входных файлов, а не на уровне файлов. Но чтобы получить количество слов на уровне файла, необходимо использовать имя входного файла. Картографы, использующие Python, могут получить имя файла с помощью команды os.environ["map.input.file"]. Список переменных среды выполнения задач: здесь .

Преобразователь вместо простого указания пары ключ / значение как <Hello, 1> также должен содержать имя обрабатываемого входного файла. Следующее может быть выведено картой <input.txt, <Hello, 1>>, где input.txt - это ключ, а <Hello, 1> - это значение.

Теперь все подсчеты слов для определенного файла будут обрабатываться одним редуктором. Затем редуктор должен агрегировать количество слов для этого конкретного файла.

Как обычно, Combiner поможет уменьшить разболтанность сети между картографом и редуктором, а также быстрее завершить работу.

Проверьте Интенсивная обработка текста с помощью MapReduce , чтобы узнать больше алгоритмов обработки текста.

...