Apache Spark Graphx:源和目标共享耻辱VertexId,但represnet不同的东西

时间:2016-12-16 20:19:37

标签: spark-graphx

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

1 个答案:

答案 0 :(得分:0)

每个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> gt的所有顶点都是用户。 userMaxID将成为项目。