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
的所有顶点都是项目。
我有一个文件,其中 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
的所有顶点都是项目。