我正在尝试解决一个练习,但仍然没有找到解决方法。
设计一个MapReduce算法,给定一个表示为弧列表的有向图,该MapReduce算法列出所有节点对(x,y),以便存在三个弧(x,a),(a,b)和(b,y)。约简器接收的值列表的长度绝不能长于图中的节点数。请提供伪代码。
很久以来,我通过以下方式找到了长度为2的路径:
map (k, v):
write (k, (v, "out"))
write (v, (k, "in"))
reduce(k ,list(v)):
// write all pairs of nodes such that one has an arc exiting and the other has an arc entering
但是从现在开始,我不明白如何找到长度为3的路径,并满足列表长度的属性。
答案 0 :(得分:1)
我不是hadoop语法专家,但可以从理论上解决这个问题。
考虑G =(V,E)-ARCS是我们的E包含元素,例如(x,a),(a,b),(b,y)
您找到了一种提取距离为2的所有节点的方法。将此集合称为2-LEN。在您的简短示例中,它将包含(x,b)和(a,y)。
让我们创建一个新的集合,定义如下(伪代码):
NEW_SET = new set
for each ((x,y) in ARCS)
NEW_SET.add(x,y,1)
for each ((x,y) in 2-LEN)
NEW_SET.add(x,y,2)
您可能已经了解,第三个参数是距离。 现在,对于您的示例,NEW_SET将包含:(x,a,1),(a,b,1),(b,y,1),(x,b,2),(a,y,2)。
现在在您的2距离算法中使用相同的逻辑-将NEW_SET映射为:
map(k,v,d):
write (k, (v, "out", d))
write (v, (k, "in" , d))
reduce(k , list (v)):
//write all pairs of nodes such that one has an 'in' and the other has an 'out' AND have different d
对于地图后的示例,我们将具有以下内容:
因此,现在您将2个距离节点与1个距离节点相连,结果所有对之间的距离均为3。
请注意,您将需要在该集合上执行uniq,因为您将获得两次(x,y)-一次是从((x,a),(a,y))获得的,一次是从((x,b)获得的, (b,y))
正如我所提到的,我不是hadoop语法方面的专家,但我相信应该有一种实现它的方法。