Graph入门介绍

0. 为什么需要图计算

  • 许多大数据以大规模图或网络的形式呈现
  • 许多非图结构的大数据,常会被转换为图模型进行分析
  • 图数据结构很好地表达了数据之间的关联性

1. 图(Graph)的基本概念

  • 图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构
    通常表示为二元组:Gragh=(V,E)
    可以对事物之间的关系建模
  • 应用场景
    在地图应用中寻找最短路径
    社交网络关系
    网页间超链接关系

2. 图的术语

  • 顶点(Vertex)
  • 边(Edge)

image-20201123142953487

image-20201123143001392

  • 有向图

image-20201123143035949

image-20201123143043598

  • 无向图

image-20201123143101126

image-20201123143107241

  • 有环图

包含一系列顶点连接的回路(环路)

image-20201123143136922

  • 无环图

    DAG即为有向无环图

image-20201123143209833

  • 度:一个顶点所有边的数量
    出度:指从当前顶点指向其他顶点的边的数量
    入度:其他顶点指向当前顶点的边的数量

image-20201123143228913

3. 图的经典表示法

  • 邻接矩阵

image-20201123143317306

1、对于每条边,矩阵中相应单元格值为1

2、对于每个循环,矩阵中相应单元格值为2,方便在行或列上求得顶点度数

4. Spark GraphX 简介

  • GraphX是Spark提供分布式图计算API
  • GraphX特点
    • 基于内存实现了数据的复用与快速读取
    • 通过弹性分布式属性图(Property Graph)统一了图视图与表视图
    • 与Spark Streaming、Spark SQL和Spark MLlib等无缝衔接

5. GraphX核心抽象

  • 弹性分布式属性图(Resilient Distributed Property Graph)

    ​ 顶点和边都带属性的有向多重图

image-20201123144701324

image-20201123144707217

​ 一份物理存储,两种视图

image-20201123144712007

对Graph视图的所有操作,最终都会转换成其关联的Table视图的RDD操作来完成

6. GraphX API

  • Graph[VD,ED]
  • VertexRDD[VD]
  • EdgeRDD[ED]
  • EdgeTriplet[VD,ED]
  • Edge:样例类
  • VertexId:Long的别名

image-20201123145033272

class Graph[VD, ED] {
   
  val vertices: VertexRDD[VD]
  val edges: EdgeRDD[ED]
  val triplets: RDD[EdgeTriplet[VD, ED]]
}
import org.apache.spark.graphx._
val vertices:RDD[(VertexId,Int)]=sc.makeRDD(Seq((1L,1),(2L,2),(3L,3)))
val edges=sc.makeRDD(Seq(Edge(1L,2L,1),Edge(2L,3L,2)))
val graph=Graph(vertices,edges)  //Graph[Int,Int] ?

import org.apache.spark.graphx.GraphLoader
//加载边列表文件创建图,文件每行描述一条边,格式:srcId dstId。顶点与边的属性均为1
val graph = GraphLoader.edgeListFile(sc,"file:///opt/spark/data/graphx/followers.txt")

导入
import org.apache.spark.graphx._

创建顶点rdd
val vertices=sc.makeRDD(seq(1L,1),(2L,2),(3L,3))

创建edges边rdd
val edges=sc.makeRDD(Seq(Edge(1L,2L,1),Edge(2L,3L,2)))

创建graph对象
 val graph=Graph(vertices,edges)

获取graph图对象的vertices信息
graph.vertices.collect

获取graph图对象的edges信息
graph.edges.collect

7. 属性图应用示例

属性图应用示例-1

  • 构建用户合作关系属性图
    • 顶点属性
      • 用户名
      • 职业
    • 边属性
      • 合作关系

image-20201123145524023

val users=sc.makeRDD(Array((3L,("rxin","student")),(7L,("jgonzal","postdoc")),(5L,("franklin","professor")),(2L,("istoica","professor"))))

 val relationship=sc.makeRDD(Array(Edge(3L,7L,"Colla"),Edge(5L,3L,"Advisor"),Edge(2L,5L,"Colleague"),Edge(5L,7L,"Pi")))

val graphUser=Graph(users,relationship)


scala> graphUser.triplets.collect
res9: Array[org.apache.spark.graphx.EdgeTriplet[(String, String),String]] = Array(((2,(istoica,professor)),(5,(franklin,professor)),Colleague), ((3,(rxin,student)),(7,(jgonzal,postdoc)),Colla), ((5,(franklin,professor)),(3,(rxin,student)),Advisor), ((5,(franklin,professor)),(7,(jgonzal,postdoc)),Pi))


属性图应用示例-2

  • 构建用户社交网络关系
    • 顶点:用户名、年龄
    • 边:打call次数

image-20201123145640689

image-20201123145653369

找出大于30岁的用户

假设打call超过5次,表示真爱。请找出他(她)们

val users=sc.makeRDD(Array((1L,("Alice",28)),(2L,("Bob",27)),(3L,("Charlie",65)),(4L,("David",42)),(5L,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值