1

我在使用 graphx 将 mapReduceTriplets 应用到我的图形网络时遇到了一些问题。

我一直在关注教程并读入我自己的数据,这些数据以 [Array[String],Int] 的形式组合在一起,例如我的顶点是:

org.apache.spark.graphx.VertexRDD[Array[String]]例如 (3999,Array(17, Low, 9))

我的优势是:

org.apache.spark.graphx.EdgeRDD[Int] 例如边缘(3999,4500,1)

我正在尝试使用 mapReduceTriplets 应用聚合类型函数,该函数计算顶点数组中的最后一个整数(在上面的示例 9 中)与第一个整数(在上面的示例 17 中)相同或不同的数量所有连接的顶点。

因此,您最终会得到一个匹配或不匹配数量的计数列表。

我遇到的问题是使用 mapReduceTriplets 应用任何函数,我对 scala 很陌生,所以这可能真的很明显,但是在 graphx 教程中,它有一个使用 Graph[Double, Int] 格式的图形的示例,但是我的图表采用 Graph[Array[String],Int] 的格式,所以我只是尝试作为第一步来弄清楚如何在示例中使用我的图表,然后从那里开始工作。

graphx网站上的例子如下:

    val olderFollowers: VertexRDD[(Int, Double)] = graph.mapReduceTriplets[(Int, Double)](
  triplet => { // Map Function
    if (triplet.srcAttr > triplet.dstAttr) {
      // Send message to destination vertex containing counter and age
      Iterator((triplet.dstId, (1, triplet.srcAttr)))
    } else {
      // Don't send a message for this triplet
      Iterator.empty
    }
  },
  // Add counter and age
  (a, b) => (a._1 + b._1, a._2 + b._2) // Reduce Function
)

任何建议将不胜感激,或者如果您认为有比使用 mapreducetriplets 更好的方法,我会很高兴听到它。

修改了新代码

val nodes = (sc.textFile("C~nodeData.csv")
.map(line => line.split(",")).map( parts => (parts.head.toLong, parts.tail) ))

val edges = GraphLoader.edgeListFile(sc, "C:~edges.txt")


val graph = edges.outerJoinVertices(nodes) {
case (uid, deg, Some(attrList)) => attrList
case (uid, deg, None) => Array.empty[String]
}


val countsRdd = graph.collectNeighbors(EdgeDirection.Either).leftOuterJoin(graph.vertices).map {
  case (id, t) => {
    val neighbors: Array[(VertexId, Array[String])] = t._1
    val nodeAttr = (t._2)
    neighbors.map(_._2).count( x => x.apply(x.size - 1) == nodeAttr(0))

  }
}
4

1 回答 1

1

我想你想用orGraphOps.collectNeighbors代替mapReduceTripletsor aggregateMessages

collectNeighbors将为您提供一个 RDD,对于图中的每个 VertexId,将连接的节点作为一个数组。只需根据您的需要减少阵列。就像是:

val countsRdd = graph.collectNeighbors(EdgeDirection.Either)
  .join(graph.vertices)
  .map{ case (vid,t) => {
    val neighbors = t._1
    val nodeAttr = t._2
    neighbors.map(_._2).filter( <add logic here> ).size
  }

如果这不能让你朝着正确的方向前进,或者你被卡住了,请告诉我(例如“”部分)。

于 2015-05-27T15:55:47.970 回答