【问题标题】:Scala getting the adjacency list of each vertex from a list of source node and destination nodeScala从源节点和目标节点列表中获取每个顶点的邻接列表
【发布时间】:2024-05-19 15:05:01
【问题描述】:

我对 Scala 和 GraphX 还很陌生,所以这可能是一个微不足道的问题。我正在尝试反转图的每个边缘的方向,然后获取新反转图的每个顶点的邻接列表。 输入格式为“FromNodeId \t ToNodeId”

0 1
0 2
1 2
1 3

我设法用以下代码反转边缘的方向:

object Problem2{
    def main(args: Array[String]){
    val inputFile:String = args(0)
    val outputFolder = args(1)
    val conf = new SparkConf().setAppName("Problem2").setMaster("local")
    val sc = new SparkContext(conf)
    val input = sc.textFile(inputFile)
    val graph = GraphLoader.edgeListFile(sc,inputFile)
    val newGraph = graph.reverse.edges
}
}

输出格式为

Edge(1,0,1)
Edge(3,1,1)
Edge(2,1,1)
Edge(2,0,1)

我的问题是, 1. 有没有更有效的解决问题的方法 2. 如何从这里开始为每个顶点构建邻接表?

【问题讨论】:

    标签: scala apache-spark spark-graphx


    【解决方案1】:

    这两个问题的答案都是collectNeighbors and collectNeighborIds

    对于每个顶点,它计算邻居列表。注意 EdgeDirection 参数。

    val vertices: RDD[(VertexId, String)] =  
        sc.parallelize(Array((1L,""), (2L,""), (4L,""), (6L,"")))
    
    
    val edges: RDD[Edge[String]] = 
        sc.parallelize(Array(
            Edge(1L, 2L, ""),
            Edge(1L, 4L, ""),
            Edge(1L, 6L, "")))
    val inputGraph = Graph(vertices, edges)
    
    val verticesWithSuccessors: VertexRDD[Array[VertexId]] = 
        inputGraph.ops.collectNeighborIds(EdgeDirection.Out)
    

    因此,由于图是不可变的,因此您必须构建一个新图。相同的边,新的顶点

    val successorGraph = Graph(verticesWithSuccessors, edges)
    

    这里是部分结果:

    val res = successorGraph.vertices.collect()
    res: Array[(org.apache.spark.graphx.VertexId,
             Array[org.apache.spark.graphx.VertexId])] = 
      Array((4,Array()), (1,Array(2, 4, 6)), (6,Array()), (2,Array()))
    

    【讨论】:

      最近更新 更多