我有这种形式的图表:
_ 3 _
/' '\
(1) (1)
/ \
1--(2)--->2
我想计算最活跃的用户(最关注的用户,这里的用户1跟随用户2和用户3的一次)。 我的图形是Graph [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(_.dstId).collect()
的类型为:
数组[(org.apache.spark.graphx.VertexId,可迭代[org.apache.spark.graphx.Edge [INT]])]
有什么想法吗?
答案 0 :(得分:2)
您按srcId
进行分组的想法很好,因为您正在寻找关系跟随而不是后跟(您的示例使用{{1}顺便说一下)
dstId
group 现在包含从每个顶点出来的边。我们现在可以获取属性的总和,以获得用户跟随任何用户的总时间。
val group = graph.edges.groupBy(_.srcId)
哪个产生
val followCount = group.map{
case (vertex, edges) => (vertex, edges.map(_.attr).sum)
}.collect
现在,如果您想要提取最多的用户,您可以按降序对其进行排序,然后选择列表的头部,这将为最活跃的用户提供。
Array((10,1), (11,1), (1,3))