簡體   English   中英

MRJob和python-用於Reducer的.csv文件輸出?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM