Узел MapReduce с максимальной степенью - PullRequest
0 голосов
/ 18 марта 2019

Я написал код, используя MRJob для вычисления максимальной степени графа.Но мой подход неверен, потому что у меня есть ограничение, что все узлы не могут быть загружены в память одной машины.

Мои данные поступают в следующем формате:

[A,B]
[B,C]
[B,D]
....

Может кто-нибудь посоветоватьмне, как изменить мой код

class MRDegreeFinder(MRJob):

def mapper(self, _, line):
    line=re.sub('([1-9][0-9]*)|0', '', line)
    lst=re.compile('\w+').findall(line)
    yield None, lst

def reducer(self, null,records):
    self.D=defaultdict()
    for record in records:
        if record[0] not in self.D:
            self.D[record[0]]=1
        else:
            self.D[record[0]]+=1

        if record[1] not in self.D:
            self.D[record[1]]=1
        else:
            self.D[record[1]]+=1
    sortlist2 = sorted(self.D.items(), key=operator.itemgetter(1), reverse=True)
    yield sortlist2[0]
    print(sortlist2[0])

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

Я пытался изменить код, используя несколько шагов, но все еще сталкиваюсь с проблемой, как вывести только один узел с максимальной степенью:

class MRDegreeFinder(MRJob):
def mapper(self, _, line):
    line=re.sub('([1-9][0-9]*)|0', '', line)
    lst=re.compile('\w+').findall(line)
    yield lst[0],1
    yield lst[1],1


def reducer_init(self):
    self.D={}
    self.maximum=0

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

def reducer_final(self,key,summ):
    if summ>self.maximum:
        self.D.clear()
        self.maximum=summ
        self.D[key]=summ    
        yield self.D


def steps(self):
    return [
        MRStep(mapper=self.mapper,
               reducer_init=self.reducer_init,
               reducer=self.reducer,
               reducer_final=self.reducer_final)
           ]


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

Спасибо взаранее за любую помощь!

...