Scala 从源节点和目标节点的列表中获取每个顶点的邻接列表
Scala getting the adjacency list of each vertex from a list of source node and destination node
我对 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. 我怎样才能从这里开始为每个顶点构建邻接表?
两个问题的答案都是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()))
我对 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. 我怎样才能从这里开始为每个顶点构建邻接表?
两个问题的答案都是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()))