你知道如何使用mapreduce范例实现这个算法吗?
def getFriends(self, degree):
friendList = []
self._getFriends(degree, friendList)
return friendList
def _getFriends(self, degree, friendList):
friendList.append(self)
if degree:
for friend in self.friends:
friend._getFriends(degree-1, friendList)
假设我们有以下双向友谊:
(1,2), (1,3), (1,4), (4,5), (4,6), (5,7), (5,8)
例如,如何获得用户1的1级、2级和3级连接?答案必须是1->2,3,4,5,7,8
谢谢
3条答案
按热度按时间olqngx591#
也许您可以使用支持类似sql查询的hive!
j5fpnvbx2#
我是这个领域的新手,但这是我的想法。
您可以使用下面的伪代码后面的传统bfs算法。
在每次迭代中,您都会启动一个hadoop作业,发现当前工作集中尚未访问的所有子节点。
这个工作的Map器和还原器如下所示。
在本例中,我只是使用静态成员来保存工作集、访问集和结果集。
它应该是使用临时文件实现的。可能有一些方法可以优化从一个迭代到下一个迭代累积的临时数据的持久性。
我用于该作业的输入文件包含翻转列表,每行一个翻转,例如1、2、2、3、5、4。。。
运行一个作业就是这样
fruv7luv3#
据我所知,你想收集社交图中某个人第n个圈子里的所有朋友。大多数图算法是递归的,递归不太适合用mapreduce方法来解决任务。
我可以建议您使用apachegiraph来解决这个问题(实际上它在引擎盖下使用mapreduce)。它主要是异步的,您可以编写描述单个节点行为的作业,如:
此外,您还可以使用层叠的map reduce作业来收集圆,但这并不是解决该任务的非常有效的方法:
将根用户朋友导出到文件
circle-001
使用circle-001
作为作业的输入,该作业将每个用户的好友从circle-001
到circle-002
做同样的事,但是使用circle-002
作为输入...
重复n次
如果有很多用户计算他们的圆,那么第一种方法更合适。第二种方法在启动多个mr作业时有巨大的开销,但它简单得多,而且适合于小输入用户集。