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

MRJob and python - .csv file output for Reducer?

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

问题是,我想让 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

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

我一直收到这个错误,但不太明白为什么:

Counters from step 1:
  Unencodable output:
    TypeError: 785

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

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

知道这里的问题是什么吗?谢谢!

要在 mrjob 中管理输入和输出格式,您需要使用 protocols

幸运的是,有一个现有的包实现了您可以使用的 CSV 协议 - https://pypi.python.org/pypi/mr3px

在您的作业脚本中导入包

from mr3px.csvprotocol import CsvProtocol

在您的作业中指定协议class

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) 

请注意,您无法可靠地向此输出添加 header 行,因为 Hadoop 将使用多个 reducer 并行生成输出。

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

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

免责声明 - 我是 mr3px 包的维护者,它是从 mr3po

派生出来的