-4

私は次のデータを持っています

Name Year  score
A    1996  84
A    1997  65
A    1996  76
A    1998  78
A    1998  65
B    1998  53
B    1996  98
B    1996  83
B    1996  54

次のように出力したい

Name Year  max_score
A    1996  84
B    1996  98

このジョブの python map reduce コードを作成するにはどうすればよいですか?

NAME と YEAR を単一のキーとして作成し、値としてスコアを作成できます。

しかし、これを処理する他の方法はありますか。

4

2 に答える 2

2

すべての年とスコアが正であると仮定します。

from collections import defaultdict

mapping = defaultdict( lambda: (0,0) )
with open(datafile) as f:
     for line in f:
         name,year,score = line.split()
         try:
            year = int(year)
            score = int(score)
         except ValueError:
            continue

         if score > mapping[name][1]:
            mapping[name] = year,score

または、もう少し簡潔ですが、エラーに対する堅牢性は低くなります。

from collections import defaultdict

mapping = defaultdict( lambda: (0,0) )
with open(datafile) as f:
     f.readline() #header.  Don't need it.
     for line in f:
         name,year,score = line.split()
         if int(score) > mapping[name][1]:
            mapping[name] = int(year),int(score)
于 2012-09-26T12:51:33.440 に答える
0

これはあなたが求めているものですか?

def mapper(key, value):
    name, year, score = value.split()
    yield name, (year, score)

def reducer(name, values):
    yield name, max(values, key=operator.itemgetter(1))
于 2012-09-26T14:58:02.143 に答える