将(key,id)的RDD与(k1,k2)

时间:2017-03-10 15:22:39

标签: apache-spark spark-graphx

我有一个原始RDD,其数据看起来有点像:

(A,A)
(A,B)
(B,C)
(C,D)

这些是图形中的边缘(表示为顶点名称。)我使用一些代码生成具有唯一ID的第二个RDD。

 (A,0)
 (B,41)
 (C,82)
 (D,123)

我想以某种方式合并这些RDD以获得最终的RDD,如下所示:

Edge(0,0,AA)
Edge(0,41,AB)
Edge(41,82,BC)
Edge(82,123,CD)

基本上创建一个Edge [RDD],以便我可以在这些边上使用graphx。是否可以将Id RDD与原始边缘RDD合并?

2 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情:

val df1 = rdd1.toDF("col1", "col2")
val df2 = rdd2.toDF("col", "val")

df1.join(df2, $"col1" === $"col").drop(col("col")).join(df2, $"col2" === $"col").drop(col("col")).show

+----+----+---+---+
|col1|col2|val|val|
+----+----+---+---+
|   A|   B|  0| 41|
|   C|   D| 82|123|
|   B|   C| 41| 82|
|   A|   A|  0|  0|
+----+----+---+---+

答案 1 :(得分:0)

如果您的身份rdd不是太大,您可以广播它来创建您的优势rdd

// Create broadcast variable from id _rdd
val bc_lookup = sc.broadcast(rdd_id.collectAsMap())

// Create lookup function that returns intermediate rdd
def lookup_custom(x: (String, String)): (Int,Int,String) = {
   (bc_lookup.value.get(x._1).get, 
    bc_lookup.value.get(x._2).get,
    x._1 + x._2)
}

val rdd_result = my_rdd.map(x => lookup_custom(x)).cache()

// Convert to Edge RDD
val e_rdd = rdd_result.map(x => Edge(x._1, x._2, x._3))

e_rdd.collect()
// res1: Array[org.apache.spark.graphx.Edge[String]] = Array(Edge(0,0,AA), Edge(0,41,AB), Edge(41,82,BC), Edge(82,123,CD))

数据

val my_rdd = sc.parallelize(Seq(("A","A"),("A","B"),("B","C"),("C", "D")))
val rdd_id = sc.parallelize(Seq(("A",0),("B",41),("C",82),("D",123)))