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
派生出来的
我正在使用 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