我有一个原始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合并?
答案 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)))