[英]MRJob and python - .csv file output for Reducer?
我將MRJob模塊用於python 2.7。 我創建了一個從MRJob繼承的類,並使用繼承的mapper函數正確映射了所有內容。
問題是,我想讓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
info_list
中的info_list
參數只是一個列表,其中包含與標頭中的類型匹配的各種值的列表(即
[
['Bill', 28, 'Male',75],
['Emily', 16, 'Female',56],
['Jason', 21, 'Male',63]]
知道這里出了什么問題嗎? 謝謝!
要管理mrjob
輸入和輸出格式,您需要使用協議 。
幸運的是,有一個現有的程序包實現了可以使用的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
分叉的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.