vertices、edges和triplets

优质
小牛编辑
164浏览
2023-12-01

verticesedges以及tripletsGraphX中三个非常重要的概念。我们在前文GraphX介绍中对这三个概念有初步的了解。

1 vertices

GraphX中,vertices对应着名称为VertexRDDRDD。这个RDD有顶点id和顶点属性两个成员变量。它的源码如下所示:

  1. abstract class VertexRDD[VD](
  2. sc: SparkContext,
  3. deps: Seq[Dependency[_]]) extends RDD[(VertexId, VD)](sc, deps)

从源码中我们可以看到,VertexRDD继承自RDD[(VertexId, VD)],这里VertexId表示顶点idVD表示顶点所带的属性的类别。这从另一个角度也说明VertexRDD拥有顶点id和顶点属性。

2 edges

GraphX中,edges对应着EdgeRDD。这个RDD拥有三个成员变量,分别是源顶点id、目标顶点id以及边属性。它的源码如下所示:

  1. abstract class EdgeRDD[ED](
  2. sc: SparkContext,
  3. deps: Seq[Dependency[_]]) extends RDD[Edge[ED]](sc, deps)

从源码中我们可以看到,EdgeRDD继承自RDD[Edge[ED]],即类型为Edge[ED]RDDEdge[ED]在后文会讲到。

3 triplets

GraphX中,triplets对应着EdgeTriplet。它是一个三元组视图,这个视图逻辑上将顶点和边的属性保存为一个RDD[EdgeTriplet[VD, ED]]。可以通过下面的Sql表达式表示这个三元视图的含义:

  1. SELECT src.id, dst.id, src.attr, e.attr, dst.attr
  2. FROM edges AS e LEFT JOIN vertices AS src, vertices AS dst
  3. ON e.srcId = src.Id AND e.dstId = dst.Id

同样,也可以通过下面图解的形式来表示它的含义:

3.1

EdgeTriplet的源代码如下所示:

  1. class EdgeTriplet[VD, ED] extends Edge[ED] {
  2. //源顶点属性
  3. var srcAttr: VD = _ // nullValue[VD]
  4. //目标顶点属性
  5. var dstAttr: VD = _ // nullValue[VD]
  6. protected[spark] def set(other: Edge[ED]): EdgeTriplet[VD, ED] = {
  7. srcId = other.srcId
  8. dstId = other.dstId
  9. attr = other.attr
  10. this
  11. }

EdgeTriplet类继承自Edge类,我们来看看这个父类:

  1. case class Edge[@specialized(Char, Int, Boolean, Byte, Long, Float, Double) ED] (
  2. var srcId: VertexId = 0,
  3. var dstId: VertexId = 0,
  4. var attr: ED = null.asInstanceOf[ED])
  5. extends Serializable

Edge类中包含源顶点id,目标顶点id以及边的属性。所以从源代码中我们可以知道,triplets既包含了边属性也包含了源顶点的id和属性、目标顶点的id和属性。

4 参考文献

【1】spark源码