我正在使用用于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]]
知道问题在这里吗?谢谢!
答案 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