写在前面
态度决定高度!让优秀成为一种习惯!
世界上没有什么事儿是加一次班解决不了的,如果有,就加两次!(- - -茂强)
什么是一个图
一个网络
Network
一个树
Tree
一个RDBMS
RDMBMS
一个稀疏矩阵
稀疏矩阵网络
或者
Kitchen sink
属性图
顶点
顶点
边
边
GRAPHX
graphx是一个图计算引擎,而不是一个图数据库,它可以处理像倒排索引,推荐系统,最短路径,群体检测等等
有向图与无向图
有向图无向图
有环图与无环图
两者的区别在于是否能够沿着方向构成一个闭环
有环图无环图
有标签图与无标签图
有标签无标签图
伪图与循环
从简单的图开始,当允许两个节点之间有多个边的时候,就是一个复合图,如果在某个节点上加个循环就成了伪图,GRAPHX中的图都是伪图
伪图与循环
二部图/偶图
偶图有个特殊的结构,就是所有的顶点分为两个数据集,所有的边都是建立在这两个数据集之间的,在一个数据集中不会存在边
偶图
RDF(Resource Description Framework )图与属性图
RDF图与属性图
邻接矩阵
邻接矩阵
SPARK GRAPHX
RDD
DATA IN GRAPHX
graphx中的Graph有两个RDD,一个是边RDD,一个是点RDD
其中UML如下
Graph UML
理解三元组
其实就是由(点、边,点)的一个有效组合,由triplets()接口获取
三元组
其中triplets()返回的结果是EdgeTriplet[VD,ED],EdgeTriplet[VD,ED]的属性接口有:
属性接口
理解aggregateMessages
首先看下源码:
def aggregateMessages[A: ClassTag](
sendMsg: EdgeContext[VD, ED, A] => Unit,
mergeMsg: (A, A) => A,
tripletFields: TripletFields = TripletFields.All): VertexRDD[A] = {
aggregateMessagesWithActiveSet(sendMsg, mergeMsg, tripletFields, None)
}
EdgeContext
EdgeContext
主要考虑
sendmsg
这两个方法
这两个方法一个吧triplets中数据发送到源节点
一个是把triplets中的数据发送到目的节点
这样就可以在源或者目的节点进行聚合操作了
看个例子:
graph.aggregateMessages[Int](_.sendToSrc(1), _ + _).foreach(println)
这个例子就是求出图的出度
sendToSrc(1)会针对每一个triplets向源节点发送1
如图
三元组
会向2节点发送一个1
_ + _ :表示针对每个节点做相加的聚合
比如下图5节点有4个triplets,采用sendToSrc方法后,它的聚合就是1+1 = 2
也就是它的出度
图
结果是
(4,1)
(3,1)
(5,3)
(2,1)
Pregel
先看源码
def apply[VD: ClassTag, ED: ClassTag, A: ClassTag]
(graph: Graph[VD, ED],
initialMsg: A,
maxIterations: Int = Int.MaxValue,
activeDirection