图组成与概念
一、图计算基本概念
vertices、edges以及triplets是GraphX中三个非常重要的概念。
注意:在GraphX框架中即使是 Int 或 String 类型,也必须要指定VD和ED的具体类型。这可认为是GraphX 的一个小的限制:不支持"缺少属性"的图,即图必须要有顶点和边属性。如果在实际场景中,你的图不需要顶点属性和边属性,可以进行最简单的处理,如将 Int 作为参数的类型,并为每条边和每个顶点设置相同的默认值。
1、vertices
在GraphX中,vertices对应着名称为VertexRDD的RDD。这个RDD有顶点id和顶点属性两个成员变量。它的源码如下所示:
abstract class VertexRDD[VD](sc: SparkContext, deps: Seq[Dependency[_]]) extends RDD[(VertexId, VD)](sc, deps)
从源码中我们可以看到,VertexRDD继承自RDD[(VertexId, VD)],这里VertexId表示顶点id,VD表示顶点所带的属性的类别。这从另一个角度也说明VertexRDD拥有顶点id和顶点属性。
2、edges
在GraphX中,edges对应着EdgeRDD。这个RDD拥有三个成员变量,分别是源顶点id、目标顶点id以及边属性。它的源码如下所示:
abstract class EdgeRDD[ED](sc: SparkContext, deps: Seq[Dependency[_]]) extends RDD[Edge[ED]](sc, deps)
从源码中我们可以看到,EdgeRDD继承自RDD[Edge[ED]],即类型为Edge[ED]的RDD。
3、triplets
在GraphX中,triplets对应着EdgeTriplet。它是一个三元组视图,它的属性提供了原顶点ID、原顶点的属性、边属性、目标定点ID和目标定点属性,Triplets其实是对Vertices和Edges作了连接操作。
这个视图逻辑上将顶点和边的属性保存为一个RDD[EdgeTriplet[VD, ED]]。可以通过下面的Sql表达式表示这个三元视图的含义:
SELECT src.id ,dst.id ,src.attr ,e.attr ,dst.attr FROM edges AS e LEFT JOIN vertices AS src , vertices AS dst ON e.srcId = src.Id
AND e.dstId = dst.Id
同样,也可以通过下面图解的形式来表示它的含义:
EdgeTriplet的源代码如下所示:
class EdgeTriplet[VD, ED] extends Edge[ED] {
//源顶点属性
var srcAttr: VD = _ // nullValue[VD]
//目标顶点属性
var dstAttr: VD = _ // nullValue[VD]
protected[spark] def set(other: Edge[ED]): EdgeTriplet[VD, ED] = {
srcId = other.srcId
dstId = other.dstId
attr