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