Я написал код, используя 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()
Спасибо взаранее за любую помощь!