spark-graphx 找到最活跃的用户?
spark-graphx finding the most active user?
我有一张这样的图表:
_ 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()
有类型:
Array[(org.apache.spark.graphx.VertexId,Iterable[org.apache.spark.graphx.Edge[Int]])]
有什么想法吗?
您按 srcId
分组的想法很好,因为您正在寻找关系 follows 而不是 is followed by(顺便说一下,您的示例使用了 dstId
)
val group = graph.edges.groupBy(_.srcId)
group 现在包含从每个顶点出来的边。我们现在可以对属性求和来获得用户关注任何用户的总时间。
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
我有一张这样的图表:
_ 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()
有类型:
Array[(org.apache.spark.graphx.VertexId,Iterable[org.apache.spark.graphx.Edge[Int]])]
有什么想法吗?
您按 srcId
分组的想法很好,因为您正在寻找关系 follows 而不是 is followed by(顺便说一下,您的示例使用了 dstId
)
val group = graph.edges.groupBy(_.srcId)
group 现在包含从每个顶点出来的边。我们现在可以对属性求和来获得用户关注任何用户的总时间。
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