01
02
03
04
05
06
07
08
09
10
|
class
VertexData()
extends
Serializable{
var
degree
:
Int
=
0
// 该节点度值
var
community
:
Long
=
0
// 该节点所属社区
var
communityDegreeSum
:
Long
=
-
1
// 该社区的度数之和
var
neighDegree
:
Int
=
0
// 目标节点的度值
var
neighCommunity
:
Long
=
-
1
// 目标节点所属社区
var
neighCommunityDegreeSum
:
Long
=
-
1
// 目标节点的社区总权重
var
edgeCount
:
Long
=
-
1
// 该节点与目标节点的连线条数
……
}
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
// 初始化图,每个节点置于不同的社区[/align][align=left]var newGraph = generateInitGraph(graph, degreeSum).cache()
do
{
// 每个节点获得邻居节点的信息
val
vertexRdd
=
newGraph.mapReduceTriplets(edgeMapFunc,
_
++
_
).cache()
// 根据上一轮中邻居的信息,更新节点的社区
val
idCommunity
=
vertexRdd.map {
case
(vid, vdArray)
=
> (vid, getBestCommunity(vdArray, curDegree))
}.cache()
// 根据新的节点社区,获得更新信息
val
updateMessage
=
getUpdateMessage(idCommunity)
// 更新图
newGraph
=
newGraph.joinVertices(updateMessage) {...}
...
}
while
(changeRate > minThreshold && i < maxIterations)
|
1
2
3
4
|
edgeRdd.leftOuterJoin(communityRdd)
.map{
case
(srcId, (dstId, srcComm))
=
> (dstId, srcComm.getOrElse(
0
L)) }
.leftOuterJoin(communityRdd)
.map{
case
(dstId, (srcComm, dstComm))
=
>(srcComm, dstComm.getOrElse(
0
L)) }
|
1
2
3
4
5
6
7
8
|
// 根据原始的
val
rawG
=
Graph.fromEdgeTuples(rawIdCommnity,
1
)
// 获得连通区域
val
connetedComponent
=
rawG.connectedComponents().vertices
// 得到最终结果
val
idCommunity
=
rawIdCommunity.join(connetedComponent).map {
case
(id, (rawCommunity, newCommunity))
=
> (id, newCommunity)
}
|