spark-19.sparkGraphx_1_sparkGraphx概述

以前处理的数据都是以记录为中心,图计算以图的方式来展示数据,更多的考虑的是顶点和边之间的关系。
spark graphx中采用RDPG Resilient Distributed Property Graphx(弹性分布式属性图)来进行抽象。

1.关键抽象:

1.顶点:RDD[(VertexId,VD)]

VertexId是Long类型,表示顶点的ID(主键),VD表示类型参数,可以是任意类型,类似于RDD[T],表示的是该顶点的属性。
VertexRDD[VD]继承了RDD[(VertexId, VD)] ,它是顶点的另一种表示方式,在内部的计算上提供了很多的优化,还有一些更高级的API。

2.边:RDD[Edge[ED]]

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])

表示边,Edge中有三个形式参数,srcId表示源顶点ID,dstId表示目标顶点的ID,attr表示属性,属性的类型为ED,可以是任意类型。
EdgeRDD[ED]继承了RDD[Edge[ED]],他是边的另外一种表示方式,在内部的计算上提供了很多的优化,还有一些高级的API。

3.三元组:RDD[EdgeTriplet[VD,ED]]

class EdgeTriplet[VD, ED] extends Edge[ED]

它表示一个三元组,比边多了两个顶点的属性。
srcId、srcAttr、attr、dstId、dstAttr

4.图:Graph[VD,ED]

abstract class Graph[VD: ClassTag, ED: ClassTag]

VD是顶点的属性、ED是边的属性。

sparkGraphx直接sparkContext来和spark集群进行连接。

2.程序怎么写

  • 流程如下:
  1. 直接创建sparkConf->sparkContext
  2. 创建顶点RDD RDD[(VertexId,VD)]
  3. 创建边的RDD RDD[Edge[ED]]
  4. 根据边和顶点创建图Graph
  5. 对图进行计算
  6. 关闭sparkContext
  • 简单代码如下:
package com.dengdan

import org.apache.spark.graphx.{Edge, Graph, VertexId}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object HelloWord extends App {
  //创建sparkConf
  val sparkConf = new SparkConf().setAppName("graphx").setMaster("local[*]")
  //创建sparkContext
  val sc = new SparkContext(sparkConf)
  //业务逻辑
  //创建顶点
  val vertextRDD: RDD[(VertexId, (String, String))] = sc.makeRDD(Array(
    (3L, ("rxin", "student")),
    (7L, ("jgonzal", "postdoc")),
    (5L, ("fanklin", "professor")),
    (2L, ("istoica", "professor"))))
  //创建边
  val edgesRDD: RDD[Edge[String]] = sc.makeRDD(Array(
    Edge(3L, 7L, "Collaborator"),
    Edge(5L, 3L, "Advisor"),
    Edge(2L, 5L, "Colleague"),
    Edge(5L, 7L, "PI")))
  //建图
  val graph = Graph(vertextRDD, edgesRDD)
  //返回三元组,进行RDD的操作
  graph.triplets.collect().foreach { edgeTriplet =>
    println(s"[src:]${edgeTriplet.srcId} ${edgeTriplet.srcAttr} [edge:] ${edgeTriplet.attr} [dst:]${edgeTriplet.dstId} ${edgeTriplet.dstAttr}")
  }
  //关闭连接
  sc.stop()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章