如何在给定一对连接边的情况下连接连接路径

时间:2019-12-09 11:42:06

标签: scala apache-spark dictionary graph graph-theory

我试图处理地图的边缘。每个边缘代表两个节点之间的路径,如图所示

links

从我拥有的地图数据中,我可以获得这种数据结构。

output: ArrayBuffer((1,4), (1,2), (2,4), (2,1), (2,3), (2,5), (3,2), (3,5), (4,1), (4,2), (5,2), (5,3))

目标是连接相连的线段/路径以计算组合长度。此处的连接顺序无关紧要,因为我只需要在连接后找到组合长度,即可检查其是否满足给定条件。可能的连接段可能是:

>(1,2,3) [or even 3,2,1 as order doesn't matter]
>(1,2,5) or (5,2,1)
>(4,2,3) or (3,2,4)
>(4,2,5) or (5,2,4)

这里的问题是:我不应该考虑像(1,2,4),(1,4),(3,2,5)或(3,5)之类的路径,因为它们不是可行的路径。我正在尝试使用Scala在Spark中实现此功能,因为实际数据是巨大的地图数据。由于我是这个领域的新手,所以我们将不胜感激。 附注:我有资料来源,可以在知道哪些段应该连接在一起的情况下获取每个路径/段的长度,并将这些长度加在一起。

更新

处理给定链接的每个节点都会得到以下结果:输出:

ArrayBuffer((1,List()), (1,List(4, 2)), (2,List(4, 1)), (2,List(3, 5)), (3,List(2, 5)), (3,List()), (4,List(1, 2)), (4,List()), (5,List(2, 3)), (5,List()) (1,List())

因为该段的左节点未连接到任何其他段,所以我们实际上可以从结果结构中忽略所有这些单个段。我使用scala映射和flatmap函数输出获得了最终结构:

ArrayBuffer((1,4), (1,2), (2,4), (2,1), (2,3), (2,5), (3,2), (3,5), (4,1), (4,2), (5,2), (5,3))

1 个答案:

答案 0 :(得分:0)

考虑使用Spark中的GraphX。您可以使数据中的每个边成为GraphX中的一个边。然后计算所需顶点之间的paths

更新

在下图中创建节点时,例如A,B,C,D,E,F,您会发现其中的某些节点只有一条边。您可以使用该条件查找路径的可能起点和终点。 除此之外,您还需要手动指定哪些节点可以或不能成为路径的起点或终点。也许还有其他信息可以用于此。 enter image description here