MRJob和python - Reducer的.csv文件输出?

时间:2015-06-24 17:12:06

标签: python csv output typeerror mrjob

我正在使用用于python 2.7的MRJob模块。我创建了一个继承自MRJob的类,并使用继承的映射器函数正确映射了所有内容。

问题是,我想让reducer函数输出一个.csv文件......这里是reducer的代码:

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

然后我在命令行中运行---&gt; python -m map_csv <inputfile.txt> outputfile.csv

我一直收到这个错误,并且真的不明白为什么:

Counters from step 1:
  Unencodable output:
    TypeError: 785

reducer中的info_list参数只是一个列表,其中包含与标题中的类型匹配的各种值的列表 (即

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

知道问题在这里吗?谢谢!

1 个答案:

答案 0 :(得分:3)

要管理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将使用多个reducer并行生成输出。

要在EMR上使用此软件包,您需要在实例引导阶段通过向配置的bootstrap部分添加项目来安装它。

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

免责声明 - 我是mr3px软件包的维护者,该软件包来自mr3po