【问题标题】:MRJob and python - .csv file output for Reducer?MRJob 和 python - Reducer 的 .csv 文件输出?
【发布时间】:2015-06-24 17:12:05
【问题描述】:

我正在为 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

然后我在命令行中运行---> 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]]

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

【问题讨论】:

  • 你不应该使用set作为变量名,但这不是问题。
  • 你是对的!很好理解。谢谢

标签: python csv output typeerror mrjob


【解决方案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 派生的

【讨论】:

  • 感谢您的回复,我遇到了同样的问题,您的解决方案运行良好。如果我在本地机器上运行文件,它会以所需格式返回结果。但是,当我在 emr 上运行文件时,它会返回此错误。 ImportError:没有名为 mr3px.csvprotocol 的模块。我是否需要对配置文件进行一些更改。谢谢
  • 是的,您需要在 EMR 引导步骤中从 pypi 安装软件包。在配置的 bootstrap 部分中,您将需要类似 - sudo pip install mr3px 的内容
  • @FahadSarfraz 更新了答案以显示如何配置您的 EMR 作业。
  • mr3px 非常好。您可能需要查看的是,对于我的情况,csv 单元格最后会包含额外的“”。例如,单元格需要有 abc。相反,它将包含 abc"" .
  • 我能够使用以下命令安装它:bootstrap: - sudo yum install -y python-setuptools - sudo easy_install pip - sudo pip install mr3px
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2013-07-04
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多