2017-01-20 2 views
0

Ich bin neu auf MapReduce und ich habe eine sehr einfache Frage. Ich löste WordCount Problem und dann möchte ich das Problem als Top N-Eintrag für Text ändern. Obwohl ich alle Wörter nach Text sortiere, kann ich den letzten N-Wert nicht annehmen. Zuerst lese ich Text und sende jedes Wort an Reduzierer mit 1 und reduziere dann das Zahlenwort für jedes andere Wort. Dann habe ich versucht, dieses Wort nach dem Vorkommen des Wortes zu sortieren. Aber ich kann nicht die Top-N finden zeichnetTop N Rekord MapReduce auf Python

from mrjob.job import MRJob 
from mrjob.step import MRStep 
from stemming.porter2 import stem 
class MRWordCount(MRJob): 
    def steps(self): 
      return [ 
       MRStep(mapper=self.mapper, 
        reducer=self.reducer), 
       MRStep(mapper=self.secondmapper, 
        reducer = self.secondreducer) 
       ] 

    def mapper(self,_,lines): 
     words = lines.strip().split() 
     for w in words: 
      yield stem(w.lower()),1 

    def reducer(self, key, values): 
     yield key, (sum(values)) 

    def secondmapper(self, key,value):  
     yield '%04d'%int(value), key 

    def secondreducer(self, key, values):  
     for v in values:   
      yield v,key 

if __name__ == '__main__': 
    MRWordCount.run() 

Antwort

0

ich das Problem mit Hilfe gelöst folgenden Code

from mrjob.job import MRJob 
from mrjob.step import MRStep 
from stemming.porter2 import stem 


class MRWordCount(MRJob): 
    def steps(self): 
      return [ 
       MRStep(mapper=self.mapper, 
        reducer=self.reducer), 
       MRStep(reducer = self.secondreducer) 
       ] 

    def mapper(self,_,lines): 
     words = lines.strip().split() 
     for w in words: 
      w = unicode(w, "utf-8", errors="ignore") 
      yield stem(w.lower()),1 

    def reducer(self, key, values): 
     yield None, ('%04d'%int(sum(values)),key) 

    def secondreducer(self, key, values): 
     self.aList= []  
     for v in values: 
      self.aList.append(v) 
     count = len(self.aList) 
     for m in range(count-5,count): 
      yield self.aList[m] 


if __name__ == '__main__': 
    MRWordCount.run()