从成对的字符串中生成“ VertexId”

时间:2018-06-19 21:01:58

标签: apache-spark spark-graphx

我正在使用GraphX在Spark上处理一些图形数据。输入数据为RDD[(String, String)]。我使用以下代码段将String映射到VertexId并构建了图形。

val input: RDD[(String, String)] = ...

val vertexIds = input.map(_._1)
                     .union(input.map(_._2))
                     .distinct()
                     .zipWithUniqueId()
                     .cache()

val edges = input.join(vertexIds)
                 .map { case (u, (v, uid)) => (v, uid) }
                 .join(vertexIds)
                 .map { case (v, (uid, vid)) => Edge(uid, vid, 1) }

val graph = Graph(vertexIds.map { case (v, vid) => (vid, v) }, edges )

当我进行抽查以查看排名前1000的最高度节点时,我发现GraphX的结果与原始输入不同。这是我转储高度节点的方法

graph.outerJoinVertices(graph.outDegrees) {
  (_, vdata, deg) => (deg.getOrElse(0L), vdata)
}.vertices.map(_._2).top(1000).saveTo(....)

我怀疑.zipWithUniqueId的每次评估都给出了不稳定的ID。我尝试过

  • 插入vertexIds.count()来强制实现,以使vertexIds不会被重新评估。
  • 插入.sortBy(...).zipWithUniqueId()以确保顺序相同。

它们都不能解决问题。每次运行的前1000个度节点的结果略有不同。

1 个答案:

答案 0 :(得分:1)

我找到了两种解决方案来稳定String -> VertexId映射:

  • vertexIds保留到FS。

    input.map(_._1)
         .union(input.map(_._2))
         .distinct()
         .zipWithUniqueId()
         .saveAsObjectFile("some location")
    val vertexId = sc.objectFile("some location")
    
  • 使用抗冲突哈希函数。我使用了Guava的murmur3_128哈希,并将前8个字节用作vertexId。使用这种方法,您无需进行任何进一步的联接,这将更加有效。