Scala spark graphx是否找到最活跃的用户?
我有一张这种形式的图表:Scala spark graphx是否找到最活跃的用户?,scala,apache-spark,spark-graphx,Scala,Apache Spark,Spark Graphx,我有一张这种形式的图表: _ 3 _ /' '\ (1) (1) / \ 1--(2)--->2 我想统计最活跃的用户(跟踪最多的用户,这里是用户1,跟踪两次用户2和一次用户3)。 我的图是这种形式的图[Int,Int] val edges = Array(Edge(1,10,1), Edge(10,1,1), Edge(11,1,1), Edge(1,11,1), Edge(1,12,1)) val vertices = Array((1
_ 3 _
/' '\
(1) (1)
/ \
1--(2)--->2
我想统计最活跃的用户(跟踪最多的用户,这里是用户1,跟踪两次用户2和一次用户3)。
我的图是这种形式的图[Int,Int]
val edges = Array(Edge(1,10,1), Edge(10,1,1), Edge(11,1,1), Edge(1,11,1), Edge(1,12,1))
val vertices = Array((12L,12), (10L,10), (11L,11), (1L,1))
val graph = Graph(sc.parallelize(vertices),sc.parallelize(edges),0)
我的想法是使用对边的srcId进行分组,使用迭代器进行计数,然后进行排序,但我在使用迭代器时遇到了一些问题,类型非常复杂:
graph.edges.groupBy(u.dstId).collect()具有以下类型:
数组[(org.apache.spark.graphx.VertexId,Iterable[org.apache.spark.graphx.Edge[Int]]]
有什么想法吗?您通过srcId
进行分组的想法很好,因为您要查找的是跟在后面的关系,而不是跟在后面的关系(顺便说一下,您的示例使用了dstId
)
组现在包含每个顶点之外的边。现在,我们可以求属性之和,以获得用户跟随任何用户的总时间
val followCount = group.map{
case (vertex, edges) => (vertex, edges.map(_.attr).sum)
}.collect
产生
Array((10,1), (11,1), (1,3))
现在,如果您想提取跟随最多的用户,您可以简单地按降序对其进行排序,并取列表的开头,这将给出最活跃的用户
val mostActiveUser = followCount.sortBy(- _._2).head
你能和我们分享一些代码吗?如何构建图形?
val mostActiveUser = followCount.sortBy(- _._2).head