MapReduce、MRJobにYelpのPythonAPIを使用する方法を学ぼうとしています。彼らの単純な単語カウンターの例は理にかなっていますが、複数の入力を含むアプリケーションをどのように処理するのか興味があります。たとえば、ドキュメント内の単語を単に数えるのではなく、ベクトルに行列を掛けます。私はこの解決策を思いつきました。これは機能しますが、ばかげていると感じます。
class MatrixVectMultiplyTast(MRJob):
def multiply(self,key,line):
line = map(float,line.split(" "))
v,col = line[-1],line[:-1]
for i in xrange(len(col)):
yield i,col[i]*v
def sum(self,i,occurrences):
yield i,sum(occurrences)
def steps(self):
return [self.mr (self.multiply,self.sum),]
if __name__=="__main__":
MatrixVectMultiplyTast.run()
このコードが実行./matrix.py < input.txtされ、それが機能する理由は、行列がinput.txtに列ごとに格納され、対応するベクトル値が行の終わりにあるためです。
したがって、次の行列とベクトル:

input.txtとして次のように表されます。

要するに、マトリックスとベクトルをより自然に別々のファイルに保存し、両方をMRJobに渡すにはどうすればよいでしょうか。