vertices、edges和triplets
优质
小牛编辑
203浏览
2023-12-01
vertices
、edges
以及triplets
是GraphX
中三个非常重要的概念。我们在前文GraphX介绍中对这三个概念有初步的了解。
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
。Edge[ED]
在后文会讲到。
3 triplets
在GraphX
中,triplets
对应着EdgeTriplet
。它是一个三元组视图,这个视图逻辑上将顶点和边的属性保存为一个RDD[EdgeTriplet[VD, ED]]
。可以通过下面的Sql
表达式表示这个三元视图的含义:
SELECT src.id, dst.id, src.attr, e.attr, dst.attrFROM edges AS e LEFT JOIN vertices AS src, vertices AS dstON 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
和属性。
4 参考文献
【1】spark源码