SparkGraphX图计算(二)

一、图计算基本概念

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
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Spark GraphX是Apache Spark的一个计算框架,用于处理大规模数据。它提供了一套丰富的算法库,可以用于分析和处理数据。 要开始使用Spark GraphX,首先需要将SparkGraphX导入你的工程。例如,你可以使用以下语句导入所需的包: import org.apache.spark._ import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD 一旦导入了SparkGraphX,你就可以使用GraphX构建功能来创建。你可以使用GraphGenerators来生成随机,然后使用的操作和算法来分析数据。例如,你可以使用GraphX的pregel操作来实现单元最短路径算法。 以下是一个使用Spark GraphX构建计算单元最短路径的示例代码: import org.apache.spark.graphx._ import org.apache.spark.graphx.util.GraphGenerators // 创建一个带有边属性的,边属性表示距离 val graph: Graph[Int, Double] = GraphGenerators.logNormalGraph(sc, numVertices = 100).mapEdges(e => e.attr.toDouble) val sourceId: VertexId = 42 // 设置起始点 // 初始化,使除了根节点外的所有顶点的距离为无穷大 val initialGraph = graph.mapVertices((id, _) => if (id == sourceId) 0.0 else Double.PositiveInfinity) // 使用pregel操作计算最短路径 val sssp = initialGraph.pregel(Double.PositiveInfinity)( (id, dist, newDist) => math.min(dist, newDist), // Vertex Program triplet => { // 发送消息 if (triplet.srcAttr + triplet.attr < triplet.dstAttr) { Iterator((triplet.dstId, triplet.srcAttr + triplet.attr)) } else { Iterator.empty } }, (a,b) => math.min(a,b) // 合并消息 ) // 打印最短路径结果 println(sssp.vertices.collect.mkString("\n")) <span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘金超DT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值