2017-07-04 4 views
2

私は単純なMapReduceの例をPythonで書いています。入力がファイルの場合、たとえばtextファイルの場合、コードを実行するために単純に次のパターンを使用します。cat <data> | map | sort | reduceたとえば、私の場合はcat data | ./mapper.py | sort | ./reducer.pyであり、すべて正常に機能します。Python - MapReduce入力としてディレクトリを渡す方法

しかし、ファイルを含むdirectoryのデータを読み込むようにマッパーとレデューサーを変更しました。だから私は入力としてpath of the directoryを渡す必要があります。データを含むディレクトリがdat/ている間、私は、次のターミナルコマンドcat dat/ | ./mapper.py | sort | ./reducer.pyをテストするが、私はエラーに直面していました:

cat: dat/: Is a directory 
Traceback (most recent call last): 
    File "./mapper.py", line 9, in <module> 
    for filename in glob.glob(sys.stdin + '*.gz'): 
TypeError: unsupported operand type(s) for +: 'file' and 'str' 

は、どのように私はPythonでMapReduceの入力としてディレクトリを渡すことができますか?

次は私のコードです:

mapper.py

#!/usr/bin/env python 
import sys 
#import timeit 
import glob 
import gzip 

QUALITY = '01459' 
MISSING = '+9999' 
for filename in glob.glob(sys.stdin + '*.gz'): 
    f = gzip.open(filename, 'r') 
    for line in f: 
     val = line.strip() 
     (year, temp, q) = (val[15:19], val[87:92], val[92:93]) 
     if temp != MISSING and q in QUALITY: 
      print " %s\t%s" % (year, temp) 

reducer.py

#!/usr/bin/env python 
import sys 

max_val = -sys.maxint 
key = '' 
for line in sys.stdin: 
    (key, val) = line.strip().split('\t') 
    max_val = max(max_val, int(val)) 
print "The last IF %s\t%s" % (key, max_val) 
+1

'zcat data/*。gz | ./mapper.py |並べ替え| ./reducer.py ' – philantrovert

+0

@philantrovertありがとうございます。私のマッパーに注意してください。入力は' .gz'ファイルを含むディレクトリアドレスで、前に行ったように 'forループ'を使ってすべて読むことができますMapReduceモデルで。しかし、あなたの提案はディレクトリ内のすべての '.gz'ファイルの正確なアドレスを渡すと思います。私は正しい? – soheil

+1

'zcat'(gzip + cat)は.gzファイルを抽出し、その内容をマッパーに渡します。たぶん、これはあなたのマッパーを変更せずに.gzファイルのために働いていたでしょう。 – Chickenmarkus

答えて

1

ラインfor filename in glob.glob(sys.stdin + '*.gz'):stdinから文字列を期待:

filenames = os.listdir(path) 
# filter files that doesn't have .gz filetype 
filenames = [file_name for file_name in filenames if file_name.endswith('.gz')] 

あなたは単にでファイルを反復処理することができます。したがって、単に代わりにファイルの内容(cat)の文字列(echo)を渡す:

$ echo dat/ | ./mapper.py | sort | ./reducer.py 

はしかし、なぜあなたは、パイプ経由で引数を渡すのですか?通常、引数は直接渡され、sys.argv(または "argparse"のようなインタープリタを介してより良い)経由でPythonによって読み込まれます。

0

現在の作業ディレクトリの使用のパスを取得するには、次の

import os 
path = os.getcwd() 

あなたはすべてのtを得ることができます彼は、このファイルからファイル:

for filename in filenames: 
    f = gzip.open(path+filename, 'r') 
関連する問題