vertices
、edges
以及triplets
是GraphX
中三个非常重要的概念。我们在前文GraphX介绍中对这三个概念有初步的了解。
在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
和顶点属性。
在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
。Edge[ED]
在后文会讲到。
在GraphX
中,triplets
对应着EdgeTriplet
。它是一个三元组视图,这个视图逻辑上将顶点和边的属性保存为一个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 = other.attr
this
}
EdgeTriplet
类继承自Edge
类,我们来看看这个父类:
case class Edge[@specialized(Char, Int, Boolean, Byte, Long, Float, Double) ED] (
var srcId: VertexId = 0,
var dstId: VertexId = 0,
var attr: ED = null.asInstanceOf[ED])
extends Serializable
Edge
类中包含源顶点id
,目标顶点id
以及边的属性。所以从源代码中我们可以知道,triplets
既包含了边属性也包含了源顶点的id
和属性、目标顶点的id
和属性。
【1】spark源码