初识graph图形化

本文介绍了图计算的重要性,特别是在大数据分析中。通过Apache Spark的GraphX库,展示了如何创建和操作图数据结构。内容包括图的基本概念,如顶点和边,以及如何加载和查询图数据。此外,还提供了两个实例,分别构建了用户合作关系和社交网络关系的图,并进行了特定条件的查询,如找出年龄大于30岁的用户和打call次数超过5次的真爱用户。

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

图(Graph)的基本概念
图是由顶点集合(Vertex)及顶点间的关系集合(edge)组成地一种网状数据结构
通常表示为二元组:

//导入 spark Graph包

import org.apache.spark.graphx._

//创建 vertices 顶点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
Array[(org.apache.spark.graphx.VertexId, Int)] = Array((1,1), (3,3), (2,2))

//获取graph图对象的edges信息

graph.edges.collect
Array[org.apache.spark.graphx.Edge[Int]] = Array(Edge(1,2,1), Edge(2,3,2))

//通过文件加载follower.txt
内容为:
2 3
3 4
1 4
2 4

val graphLoad = GraphLoader.edgeListFile(sc,"file:///opt/kb09file/follower.txt")

graphLoad: org.apache.spark.graphx.Graph[Int,Int] = org.apache.spark.graphx.impl.GraphImpl@728b0dc0

graphLoad.vertices.collect

res7: Array[(org.apache.spark.graphx.VertexId, Int)] = Array((4,1), (1,1), (3,1), (2,1))

graphLoad.edges.collect

res8: Array[org.apache.spark.graphx.Edge[Int]] = Array(Edge(1,4,1), Edge(2,3,1), Edge(2,4,1), Edge(3,4,1))

graphLoad.triplets.collect

res9: Array[org.apache.spark.graphx.EdgeTriplet[Int,Int]] = Array(((1,1),(4,1),1), ((2,1),(3,1),1), ((2,1),(4,1),1), ((3,1),(4,1),1))

//实例1
//构建用户合作关系属性图
顶点属性:
用户名、职业
边属性:
合作关系
在这里插入图片描述

//顶点属性

val users = sc.parallelize(Array((3L,("rxin","student")),(7L,("jgnorzal","postdoc")),(5L,("franklin","professor")),(2L,("istorica","professor"))))

//边属性

val relationship = sc.parallelize(Array(Edge(3L,7L,"Collaborator"),Edge(5L,3L,"Advisor"),Edge(2L,5L,"Colleague"),Edge(5L,7L,"PI")))

//构建图

val graphUser = Graph(users,relationship)

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

//顶点

val social = sc.parallelize(Array((1L,("Alice",28)),(2L,("Bob",27)),(3L,("Charlie",65)),(4L,("David",52)),(5L,("Ed",55)),(6L,("Fran",50))))

//边

val callRDD = 			   sc.makeRDD(Array(Edge(2L,1L,7),Edge(3L,2L,4),Edge(3L,6L,3),Edge(2L,4L,2),Edge(4L,1L,1),Edge(5L,2L,2),Edge(5L,3L,8),Edge(5L,6L,3)))

//构建图

val userCallGraph = Graph(social,callRDD)

//找出大于30岁的用户

userCallGraph.vertices.filter{ case (id,(name,age)) => age > 30}.collect.foreach(println)
userCallGraph.vertices.filter(v => v._2._2 > 30).collect.foreach(println)
userCallGraph.vertices.filter(v => v._2._2 > 30).collect.foreach(x => println("name:" + x._2._1 + "\t" + "age:" + x._2._2))

//假设打call次数超过5次,表示真爱。请找出他们

userCallGraph.triplets.collect.foreach(x => println(x.dstAttr))	//尾节点属性
userCallGraph.triplets.collect.foreach(x => println(x.srcAttr))	//初始节点属性
userCallGraph.triplets.collect.foreach(x => println(x.attr))	//边属性
userCallGraph.triplets.filter(x => x.attr > 5).collect.foreach(x => println(x.srcAttr._1 + " like " + x.dstAttr._1 + ",stage is " x.attr))	//打call次数大于5的
userCallGraph.numEdges	//边数
userCallGraph.numVertices	//节点数
userCallGraph.outDegrees.collect	//所有节点的出度
userCallGraph.inDegrees.collect	//所有节点入度
userCallGraph.degrees.collect	//所有节点的出入度
userCallGraph.mapVertices{case (verid,(name,age)) => (verid,name)}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值