Spark连接-(边和顶点)

时间:2020-07-28 08:16:15

标签: scala apache-spark

我有vertexRDD,其中有2列

(vertexId, uniqueVertexId)
(V1, 1L)
(V2, 2L)
(V3, 3L)
(V4, 4L)

我也有edgeRDD

(srcId, destId)
(V1, V2)
(V2, V3)
(V1, V4)

如何将它们加入火花中,以便边缘RDD如下所示

(srcId, destId, uniqueSrcId, uniqueDestId)
(V1, V2, 1L, 2L)
(V2, V3, 2L, 3L)
(V1, V4, 1L, 4L)

我尝试了不同的联接,但实际上无法实现预期的输出。感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我将使用Java,但我想将其转换为Scala很简单。
假设
edgeRDD具有类型JavaPairRDD<String,String>
vertexRDD的类型为JavaPairRDD<String,Long>

  1. edgeRDD.join(vertexRDD)将产生具有以下内容的JavaPairRDD<String,Tuple2<String,Long>>(我们将其称为join1):

    (V1, Tuple2(V2,1L)) 
    (V2, Tuple2(V3,2L))
    (V1, Tuple2(V4,1L))
    
  2. 然后通过使用map重构键和值(将其称为join1)将JavaPairRDD<String,Tuple2<String,Long>>转换为另一个join2

    (V2, Tuple2(V1,1L)) 
    (V3, Tuple2(V2,2L))
    (V4, Tuple2(V1,1L))
    
  3. 最后执行vertexRDD.join(join2)以获得JavaPairRDD<String,Tuple2<Long,Tuple2<String,Long>>>的内容:

    (V2, Tuple2(2L, Tuple2(V1,1L)))
    (V3, Tuple2(3L, Tuple2(V2,2L)))
    (V4, Tuple2(4L, Tuple2(V1,1L)))
    

,您可以通过地图并通过在地图内适当组合键和值来创建JavaRDD<String>(或新的JavaPairRDD)。我将把映射阶段留给您。

相关问题