2016-10-12 8 views
1

У меня есть график этой формы: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((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]])]

Любые идеи?

+0

Вы можете поделиться с нами своим кодом? Как вы строите свой график? – cheseaux

ответ

2

Ваша идея группировки по srcId хорошо, поскольку вы ищете отношения следует и не следуют (ваш пример использует dstId, кстати)

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)) 

Теперь, если вы хотите, чтобы извлечь пользователя, который следует больше всего, вы можете просто сортировать его по убыванию и взять голову списка, который даст наиболее активный пользователь.

val mostActiveUser = followCount.sortBy(- _._2).head 
Смежные вопросы