MapReduce之统计和列出大图中的所有三角形
什么是三角形
图作为一个数据结构,包括一个有限的节点集,称为顶点。包括一个有限的线集,称为边,边会连接其中一些或全部节点。令 T = ( a , b , c ) T=(a,b,c) T=(a,b,c)是图G中三个不同节点构成的一个集合,如果其中两个节点相连 ( a , b ) , ( a , c ) (a,b),(a,c) (a,b),(a,c), T T T就是一个三联体,如果所有三个节点都相连(a,b),(a,c),(b,c),这就是一个三角形
三角形的意义
在图论分析中,有三个很重要的度量参数:
- 全局集聚系数
- 传递比,即
T ( G ) = 3 × ( 图 中 三 角 形 个 数 ) ( 互 连 的 顶 点 三 联 体 个 数 ) T(G)=\frac{3\times (图中三角形个数)}{(互连的顶点三联体个数)} T(G)=(互连的顶点三联体个数)3×(图中三角形个数) - 局部集聚系数
要为一个大图计算这3个度量参数,必须要统计出图中三角形个数,在社交图中也具有广泛应用。
MapReduce解决方案
这个方案分为如下三步:
-
1、生成经过u的长度为2的路径,并复制从u出发的所有边作为键。如下所示
mapper: ( k , v ) → { ( k , v ) , ( v , k ) } (k,v)\rightarrow \{(k,v),(v,k)\} (k,v)→{(k,v),(v,k)}
reducer: { ( k , v 1 ) , ( k , v 2 ) , … , ( k , v n ) } → { [ ( v 1 , v 2 ) , ( k ) ] , [ ( v 1 , v 3 ) , ( k ) } , … [ ( v n − 1 , v n ) , ( k ) ] , [ ( k , v 1 ) , ( − ) ] [ ( k , v 2 ) , ( − ) ] … [ ( k , v n ) , ( − ) ] \{(k,v_1),(k,v_2),\dots,(k,v_n)\}\rightarrow\{[(v_1,v_2),(k)], \\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad [(v_1,v_3),(k)\},\\\qquad\qquad\qquad\qquad\qquad \qquad\qquad \qquad \dots \\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad [(v_{n-1},v_n),(k)],\\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad [(k,v_1),(-)]\\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad [(k,v_2),(-)]\\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \dots \\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad [(k,v_n),(-)] {(k,v1),(k,v2),…,(k,vn)}→{[(v1,v2),(k)],[(v1,v3),(k)},…[(vn−1,vn),(k)],[(k,v1),(−)][(k,v2),(−)]…[(k,vn),(−)] -
2、判断三角形,表示为 { { u , v } , { v , w } , { w , u } } \{\{u,v\},\{v,w\},\{w,u\}\} {{u,v},{v,w},{w,u}},通过以下过程实现:
mapper:
[
(
u
,
v
)
,
(
w
)
]
→
[
(
u
,
v
)
,
(
w
)
]
[(u,v),(w)]\rightarrow [(u,v),(w)]
[(u,v),(w)]→[(u,v),(w)]
reducer:
{
[
(
u
,
v
)
,
(
−
)
]
,
[
(
u
,
v
)
,
(
w
1
)
]
,
…
,
[
(
u
,
v
)
,
(
w
n
)
]
→
{
[
(
u
,
v
,
w
1
)
]
,
…
,
[
(
u
,
v
,
w
n
)
]
}
\{[(u,v),(-)],[(u,v),(w_1)],\dots,[(u,v),(w_n)] \rightarrow \{[(u,v,w_1)],\\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \dots , \\\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad[(u,v,w_n)]\}
{[(u,v),(−)],[(u,v),(w1)],…,[(u,v),(wn)]→{[(u,v,w1)],…,[(u,v,wn)]}
reducer:
{
[
(
u
,
v
)
,
(
−
)
]
,
[
(
u
,
v
)
,
(
w
1
)
]
,
…
,
[
(
u
,
v
)
,
(
w
n
)
]
→
N
o
O
u
t
P
w
t
}
\{[(u,v),(-)],[(u,v),(w_1)],\dots,[(u,v),(w_n)] \rightarrow NoOutPwt\}
{[(u,v),(−)],[(u,v),(w1)],…,[(u,v),(wn)]→NoOutPwt}
- 3、删除重复的三角形[(a,b,c)等同于(a,c,b),如下所示
mapper:
(
k
,
v
)
→
(
s
o
r
t
(
k
)
,
v
)
(k,v) \rightarrow (sort(k),v)
(k,v)→(sort(k),v)
reducer:
{
(
k
,
v
1
,
)
,
(
k
,
v
2
)
,
…
}
→
{
(
k
,
n
u
l
l
)
}
}
\{ (k,v_1,),(k,v_2),\dots \} \rightarrow \{(k,null)\}\}
{(k,v1,),(k,v2),…}→{(k,null)}}
在下一篇博客中,将详细展示详细代码