2015-06-24 5 views
0

Я использую модуль MRJob для python 2.7. Я создал класс, который наследует от MRJob, и правильно отобразил все, используя унаследованную функцию mapper.Файл MRJob и python - .csv для редуктора?

Проблема, я хотел бы иметь выход функции редуктора файл .csv ... вот код для редуктора:

def reducer(self, geo_key, info_list): 
     info_list.insert(0, ['Name,Age,Gender,Height']) 
     for set in info_list: 
      yield set 

Затем я запустить в командной строке --->python -m map_csv <inputfile.txt> outputfile.csv

я получаю эту ошибку, и действительно не понимаю, почему:

Counters from step 1: 
    Unencodable output: 
    TypeError: 785 

параметр info_list в редукторе просто список, содержащий списки различных значений, которые соответствуют типам в заголовке (т.

[ 
['Bill', 28, 'Male',75], 
['Emily', 16, 'Female',56], 
['Jason', 21, 'Male',63]] 

Любая идея, в чем проблема? Благодаря!

+0

Вы не должны использовать 'set' в качестве имени переменной, но это не проблема. – ChrisP

+0

Вы правы! Хороший улов на этом. Спасибо –

ответ

1

Чтобы управлять форматами ввода и вывода в mrjob, вам необходимо использовать protocols.

К счастью, есть существующий пакет, который реализует протокол CSV, который можно использовать - https://pypi.python.org/pypi/mr3px

импортировать пакет в вашей работе скрипта

from mr3px.csvprotocol import CsvProtocol 

Укажите протокол в классе работы

class CsvOutputJob(MRJob): 
    ... 
    OUTPUT_PROTOCOL = CsvProtocol # write output as CSV 

И вот только yield Ваш список (или кортеж) полей

def reducer(self, geo_key, info_list): 
    for row in info_list: 
     yield (None, row) 

Обратите внимание, что вы не можете надежно добавить строку заголовка в этот вывод, потому что Hadoop будет использовать несколько редукторов для генерации вывода параллельно.

Чтобы использовать этот пакет в EMR, вам необходимо установить его во время фазы начальной загрузки экземпляра, добавив элемент в раздел bootstrap вашей конфигурации.

runners: 
    emr: 
    ... 
    bootstrap: 
     - sudo apt-get install -y python-setuptools 
     - sudo easy_install pip 
     - sudo pip install mr3px 

отказ от ответственности - Я хранитель mr3px пакета, который раздвоенной от mr3po

+0

Спасибо за ваш ответ, у меня была такая же проблема, и ваше решение работало отлично. Только одно, если я запустил файл на своем локальном компьютере, он вернет результат в требуемом формате. Однако, когда я запускаю файл на emr, он возвращает эту ошибку. ImportError: нет модуля с именем mr3px.csvprotocol. Мне нужно внести некоторые изменения в файл конфигурации. Спасибо –

+0

Да, вам нужно установить пакет из pypi на шаге начальной загрузки EMR. В разделе 'bootstrap' вашей конфигурации вам понадобится что-то вроде' - sudo pip install mr3px' – msharp

+0

@FahadSarfraz Обновлен ответ, чтобы показать, как настроить ваши задания EMR. – msharp

 Смежные вопросы

  • Нет связанных вопросов^_^