本节主要理解什么是点、线以及利用点和线创建图
为什么需要图计算
许多大数据以大规模图或网络的形式呈现
许多非图结构的大数据,常会被转换为图模型进行分析
图数据结构很好地表达了数据之间的关联性
图(Graph)的基本概念
图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构
1、通常表示为二元组:Gragh=(V,E)
2、可以对事物之间的关系建模
应用场景
1、在地图应用中寻找最短路径
2、社交网络关系
3、网页间超链接关系
图的术语
顶点(Vertex)
边(Edge)
有向图
G=(V,E)
V={A,B,C,D,E}
E={<A,B>,<B,C>,<B,D>,<C,E>,<D,A>,<E,D>}
无向图
G=(V,E)
V={A,B,C,D,E}
E={(A,B),(A,D),(B,C),(B,D),(C,E),(D,E)}
有环图
包含一系列顶点连接的回路(环路)
无环图
DAG即为有向无环图
度:一个顶点所有边的数量
出度:指从当前顶点指向其他顶点的边的数量
入度:其他顶点指向当前顶点的边的数量
Spark GraphX 简介
GraphX是Spark提供分布式图计算API
GraphX特点
1、基于内存实现了数据的复用与快速读取
2、通过弹性分布式属性图(Property Graph)统一了图视图与表视图
3、与Spark Streaming、Spark SQL和Spark MLlib等无缝衔接
实例演示
问题:年龄大于30岁的有哪些?
package com.kgc.kb07.test0810
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.graphx._
object testGraphX {
def main(args: Array[String]): Unit = {
//1、获取连接
val conf = new SparkConf().setAppName("testGraphX").setMaster("local[*]")
val sc = SparkContext.getOrCreate(conf)
//2、声明一个tweeters
val tweeters = Array((1L, ("Alice", 28)), (2L, ("Bob", 27)), (3L, ("Charlie", 65)), (4L, ("David", 42)), (5L, ("Ed", 55)), (6L, ("Fran", 50)))
val rddTweeters = sc.parallelize(tweeters)
//3、声明一个Edges 注意转换格式
val followRelations = Array((2L, 1L, 7), (4L, 1L, 1), (2L, 4L, 2), (5L, 2L, 2), (3L, 2L, 4), (5L, 6L, 3), (3L, 6L, 3), (5L, 3L, 8))
val rddEdges = sc.parallelize(followRelations.map(x => Edge(x._1, x._2, x._3)))
//4、声明一个graph
val graph = Graph(rddTweeters, rddEdges)
graph.vertices.collect.foreach(println)//有哪些节点
println("-----------------")
graph.edges.collect.foreach(println) //有哪些边
println("-----------------")
graph.inDegrees.collect.foreach(println) //图形中 每个节点有几个线进来(6,2)->第六个节点有两根进来
println("-----------------")
graph.outDegrees.collect.foreach(println) //图形中 每个节点有几根线出去
println("-----------------")
//5、有哪些人年龄大于50岁
graph.vertices.filter { case (id, (name, age)) => age > 30 }.collect.foreach(println)
}
}
(6,(Fran,50))
(1,(Alice,28))
(2,(Bob,27))
(3,(Charlie,65))
(4,(David,42))
(5,(Ed,55))
-----------------
Edge(2,1,7)
Edge(4,1,1)
Edge(2,4,2)
Edge(5,2,2)
Edge(3,2,4)
Edge(5,6,3)
Edge(3,6,3)
Edge(5,3,8)
-----------------
(6,2)
(1,2)
(2,2)
(3,1)
(4,1)
-----------------
(2,2)
(3,2)
(4,1)
(5,3)
-----------------
(6,(Fran,50))
(3,(Charlie,65))
(4,(David,42))
(5,(Ed,55))
Process finished with exit code 0