更新 graphx 中的边权重
Update edge weight in graphx
我正在玩 graphx。我建立了一个图表
我正在尝试更新关系的权重,
import org.apache.spark.rdd.RDD
import org.apache.spark.graphx._
def pageHash(title:String ) = title.toLowerCase.replace(" ","").hashCode.toLong
val vertexArray = Array(
(pageHash("Alice"), ("Alice")),
(pageHash("Bob"), ("Bob")),
(pageHash("Charlie"), ("Charlie")),
(pageHash("David"), ("David")),
(pageHash("Ed"), ("Ed")),
(pageHash("Fran"), ("Fran"))
)
val edgeArray = Array(
Edge(pageHash("Bob"), pageHash("Alice"), 7),
Edge(pageHash("Bob"), pageHash("David"), 2),
Edge(pageHash("Charlie"), pageHash("Bob"), 4),
Edge(pageHash("Charlie"), pageHash("Fran"), 3),
Edge(pageHash("David"), pageHash("Alice"), 1),
Edge(pageHash("Ed"), pageHash("Bob"), 2),
Edge(pageHash("Ed"), pageHash("Charlie"), 8),
Edge(pageHash("Ed"), pageHash("Fran"), 3)
)
val vertexRDD: RDD[(Long, (String))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
val graph: Graph[(String), Int] = Graph(vertexRDD, edgeRDD)
graph.triplets.filter(triplet => triplet.srcAttr.equals("Bob")&&triplet.dstAttr.equals("Alice")).collect()
graph.triplets.filter(triplet => triplet.srcAttr.equals("Bob")&&triplet.dstAttr.equals("Alice")).
map(triplet=> triplet.attr.toString.toInt+1).collect()
我无法增加节点的权重,有什么办法吗?
您不能直接更新 Edge
,但您可以通过添加具有相同 src
和 dst
的新 Edge
在功能上做同样的事情你的 Graph
中的 edges
RDD
和权重的增量,然后调用你的 groupEdges
。换句话说,如果你有下图:
val edges = sc.parallelize(Array(Edge(1L, 2L, 1.0), Edge(2L, 3L, 2.0)))
val vertices = sc.parallelize(Array((1L, "Bob"), (2L, "Tom"), (3L, "Jerry")))
val graph = Graph(vertices, edges)
您可以像这样将 1.0
添加到其中一条边的权重:
val newGraph = Graph(graph.vertices, graph.edges.union(
sc.parallelize(Array(Edge(2L, 3L, 1.0)))
).groupEdges((a, b) => a + b)
我正在玩 graphx。我建立了一个图表 我正在尝试更新关系的权重,
import org.apache.spark.rdd.RDD
import org.apache.spark.graphx._
def pageHash(title:String ) = title.toLowerCase.replace(" ","").hashCode.toLong
val vertexArray = Array(
(pageHash("Alice"), ("Alice")),
(pageHash("Bob"), ("Bob")),
(pageHash("Charlie"), ("Charlie")),
(pageHash("David"), ("David")),
(pageHash("Ed"), ("Ed")),
(pageHash("Fran"), ("Fran"))
)
val edgeArray = Array(
Edge(pageHash("Bob"), pageHash("Alice"), 7),
Edge(pageHash("Bob"), pageHash("David"), 2),
Edge(pageHash("Charlie"), pageHash("Bob"), 4),
Edge(pageHash("Charlie"), pageHash("Fran"), 3),
Edge(pageHash("David"), pageHash("Alice"), 1),
Edge(pageHash("Ed"), pageHash("Bob"), 2),
Edge(pageHash("Ed"), pageHash("Charlie"), 8),
Edge(pageHash("Ed"), pageHash("Fran"), 3)
)
val vertexRDD: RDD[(Long, (String))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
val graph: Graph[(String), Int] = Graph(vertexRDD, edgeRDD)
graph.triplets.filter(triplet => triplet.srcAttr.equals("Bob")&&triplet.dstAttr.equals("Alice")).collect()
graph.triplets.filter(triplet => triplet.srcAttr.equals("Bob")&&triplet.dstAttr.equals("Alice")).
map(triplet=> triplet.attr.toString.toInt+1).collect()
我无法增加节点的权重,有什么办法吗?
您不能直接更新 Edge
,但您可以通过添加具有相同 src
和 dst
的新 Edge
在功能上做同样的事情你的 Graph
中的 edges
RDD
和权重的增量,然后调用你的 groupEdges
。换句话说,如果你有下图:
val edges = sc.parallelize(Array(Edge(1L, 2L, 1.0), Edge(2L, 3L, 2.0)))
val vertices = sc.parallelize(Array((1L, "Bob"), (2L, "Tom"), (3L, "Jerry")))
val graph = Graph(vertices, edges)
您可以像这样将 1.0
添加到其中一条边的权重:
val newGraph = Graph(graph.vertices, graph.edges.union(
sc.parallelize(Array(Edge(2L, 3L, 1.0)))
).groupEdges((a, b) => a + b)