2015-07-21 3 views
1

Например, если у меня есть две графы с вершинами и ребрами, как это:Как я могу получить количество общих ребер в Spark Graphx?

import org.apache.spark.graphx._ 
import org.apache.spark.rdd.RDD 

val vertexRdd1: RDD[(VertexId, (String, Int))] = sc.parallelize(Array(
     (1L, ("a", 28)), 
     (2L, ("b", 27)), 
     (3L, ("c", 65)) 
)) 

val edgeRdd1: RDD[Edge[Int]] = sc.parallelize(Array(
    Edge(1L, 2L, 1), 
    Edge(2L, 3L, 8) 
)) 

val vertexRdd2: RDD[(VertexId, (String, Int))] = sc.parallelize(Array(
    (1L, ("a", 28)), 
    (2L, ("b", 27)), 
    (3L, ("c", 28)), 
    (4L, ("d", 27)), 
    (5L, ("e", 65)) 
)) 

val edgeRdd2: RDD[Edge[Int]] = sc.parallelize(Array(
    Edge(1L, 2L, 1), 
    Edge(2L, 3L, 4), 
    Edge(3L, 5L, 1), 
    Edge(2L, 4L, 1) 
)) 

Как я могу получить число общих ребер между этими двумя графиками, без учета атрибута края? Таким образом, в приведенном выше примере количество общих ребер равно 2, а общие ребра: Edge (1L, 2L, 1), общие с Edge (1L, 2L, 1) и Edge (2L, 3L, 8), общие с Edge (2L, 3L, 4).

Я программирую в scala.

ответ

1

Если у вас есть graph1 (Graph(vertexRdd1, edgeRdd1)) и graph2 (Graph(vertexRdd2, edgeRdd2))) можно сопоставить края до (srcId, dstId), а затем использовать intersection метод:

val srcDst1 = graph1.edges.map(e => (e.srcId, e.dstId)) 
val srcDst2 = graph2.edges.map(e => (e.srcId, e.dstId)) 
srcDst1.intersection(srcDst2).count() 
+0

Спасибо большое, это сработало !!! –

Смежные вопросы