Apache Spark Graphx :Source 和 Destination 共享耻辱的 VertexId 但 represnet 不同的东西

Apache Spark Graphx :Source and Destination share the shame VertexId but represnet different things

我有一个文件,其中 srcId -> dstId 值表示我使用 GraphLoader edgeListFile 加载的图形的边,源表示用户和目标项目,在某些情况下,srcId 和 dstId 是相等的,所以是某些算法中的错误,例如当我想收集每个顶点的邻居时。我可以做些什么来将用户与项目分开并且不丢失任何信息吗

每个 GraphX 顶点都必须由唯一的 long 值定义。如果源 ID 和目标 ID 代表不同的东西,您需要通过一些操作来转换它们以确保它们是不同的。例如,假设您已将数据读入 RDD[(Long, Long)],您可以这样做:

import org.apache.spark.rdd.RDD
import org.apache.spark.graphx.{Edge, Graph}

val userMaxID = rdd.map(_._1).distinct.max
val edges: RDD[Edge[Int]] = rdd.map { 
  case (userID, itemID) => Edge(userID, itemID + userMaxID, 0) 
}

val g = Graph.fromEdges(edges, 0)

然后你会得到一个图表,其中所有项目ID都是它们的原始ID + 用户的最大ID(如果ID可以是0,则需要额外添加1)。

请注意,这只是一个建议,想法是您需要以任何项目都不能与用户具有相同 ID 的方式转换您的 ID。此外,您可能希望保留一种方法来了解给定顶点是用户还是项目;在我的建议中,ID <= userMaxID 的所有顶点都是用户,而 ID > userMaxID 的所有顶点都是项目。