【Spark GraphX】社交网图分析
目录
一、数据
1、数据关系图
2、 数据说明
3、顶点表
4、边表
二、需求
三、需求实现
1、构造fans网图
2、找出年龄大于30岁的顶点
3、找出边属性大于5的边
4、将每个顶点的年龄+20
5、将边的属性*3
6、找出顶点年龄大于30的子图
7、创建以User作为顶点的新图
8、找出年纪最大的追求者
9、计算追求者的平均年纪
10、找出顶点5到各顶点的最短距离
一、数据
1、数据关系图
2、 数据说明
每个顶点代表一位社交成员,如顶点3(顶点id为3,成员姓名为Charlie,成员年龄为65)。
两个顶点之间边的箭头方向就是成员的被追求者与粉丝的关系,箭头方向表示被追求者,箭尾方向成员表示被追求者的粉丝。
两个顶点之间边上的数据表示粉丝点击被追求者的次数。
3、顶点表
ID | 属性 |
1 | (Alice,28) |
2 | (Bob,27) |
3 | (Charlie,65) |
4 | (David,42) |
5 | (Ed,55) |
6 | (Fran,50) |
4、边表
源ID | 目的ID | 属性 |
2 | 1 | 7 |
2 | 4 | 2 |
3 | 2 | 4 |
3 | 6 | 3 |
4 | 1 | 1 |
5 | 2 | 2 |
5 | 3 | 8 |
5 | 6 | 3 |
二、需求
- 构造fans网图。
- 找出年龄大于30岁的顶点。
- 找出边属性大于5的边。
- 将每个顶点的年龄+20。
- 将边的属性*3。
- 找出顶点年龄大于30的子图。
- 创建以User作为顶点的新图。
- 找出年纪最大的追求者。
- 计算追求者的平均年纪。
- 找出顶点5到各顶点的最短距离。
三、需求实现
1、构造fans网图
//设置顶点和边,注意顶点和边都是用元组定义的Array//顶点的数据类型是VD:(String,Int)val vertexArray = Array((1L, ("Alice", 28)),(2L, ("Bob", 27)),(3L, ("Charlie", 65)),(4L, ("David", 42)),(5L, ("Ed", 55)),(6L, ("Fran", 50)))//边的数据类型ED:Intval edgeArray = Array(Edge(2L, 1L, 7),Edge(2L, 4L, 2),Edge(3L, 2L, 4),Edge(3L, 6L, 3),Edge(4L, 1L, 1),Edge(5L, 2L, 2),Edge(5L, 3L, 8),Edge(5L, 6L, 3))//构造vertexRDD和edgeRDDval vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)//构造图Graph[VD,ED]val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)
2、找出年龄大于30岁的顶点
graph.vertices.filter(_._2._2 > 30).collect().foreach(v => println(v))graph.vertices.filter { case (id, (name, age)) => age > 30 }.collect().foreach(v => println(v))
3、找出边属性大于5的边
graph.edges.filter(e => e.attr > 5).collect().foreach(v => println(v))
4、将每个顶点的年龄+20
graph.mapVertices((vid, attr) => attr._2 + 20).vertices.collect().foreach(v => println(v))graph.mapVertices { case (id, (name, age)) => age + 20 }.vertices.collect().foreach(v => println(v))
5、将边的属性*3
graph.mapEdges(e => e.attr * 3).edges.collect().foreach(v => println(v))
6、找出顶点年龄大于30的子图
val subGraph: Graph[(String, Int), Int] = graph.subgraph(vpred = (id, vd) => vd._2 > 30)subGraph.vertices.collect.foreach(v => println(s"${v._2._1} is ${v._2._2}"))
7、创建以User作为顶点的新图
case class User(name: String, age: Int, inDeg: Int, outDeg: Int)//创建一个新图,顶点VD的数据类型为User,并从graph做类型转换val initialUserGraph: Graph[User, Int] = graph.mapVertices { case (id, (name, age)) => User(name, age, 0, 0) }//initialUserGraph与inDegrees、outDegrees(RDD)进行连接,并修改initialUserGraph中inDeg值、outDeg值val userGraph: Graph[User, PartitionID] = initialUserGraph.outerJoinVertices(initialUserGraph.inDegrees) {case (id, u, inDegOpt) => User(u.name, u.age, inDegOpt.getOrElse(0), u.outDeg)}.outerJoinVertices(initialUserGraph.outDegrees) {case (id, u, outDegOpt) => User(u.name, u.age, u.inDeg, outDegOpt.getOrElse(0))}userGraph.vertices.collect.foreach(v => println(s"${v._2.name} inDeg: ${v._2.inDeg} outDeg: ${v._2.outDeg}"))
8、找出年纪最大的追求者
val oldestFollower: VertexRDD[(String, Int)] = graph.aggregateMessages[(String, Int)](// 将源顶点的属性发送给目标顶点,map过程triplet => {triplet.sendToDst(triplet.srcAttr._1, triplet.srcAttr._2)},// 得到最大追求者,reduce过程(a, b) => if (a._2 > b._2) a else b)// oldestFollower.foreach(v=>println(v)) (3,(Ed,55))userGraph.vertices.leftJoin(oldestFollower) { (id, user, optOldestFollower) => {optOldestFollower match {case None => s"${user.name} does not have any followers."case Some((name, age)) => s"${name} is the oldest follower of ${user.name}."}}}.collect.foreach { case (id, str) => println(str) }
9、计算追求者的平均年纪
val averageAge: VertexRDD[Double] = graph.aggregateMessages[(Int, Double)](// 将源顶点的属性 (1, Age)发送给目标顶点,map过程triplet => {triplet.sendToDst((1, triplet.srcAttr._2.toDouble))},// 得到追求着的数量和总年龄(a, b) => ((a._1 + b._1), (a._2 + b._2))).mapValues((id, p) => p._2 / p._1)userGraph.vertices.leftJoin(averageAge) { (id, user, optAverageAge) => {optAverageAge match {case None => s"${user.name} does not have any followers."case Some(avgAge) => s"The average age of ${user.name}\'s followers is $avgAge."}}}.collect.foreach { case (id, str) => println(str) }
10、找出顶点5到各顶点的最短距离
val sourceId: VertexId = 5L//Double.NEGATIVE_INFINITY 负无穷//Double.POSITIVE_INFINITY 正无穷val initialGraph: Graph[Double, PartitionID] = graph.mapVertices((id, _) => if (id == sourceId) 0.0 else Double.PositiveInfinity)val sssp: Graph[Double, PartitionID] = initialGraph.pregel(Double.PositiveInfinity)((id, dist, newDist) => math.min(dist, newDist),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"))
【Spark GraphX】社交网图分析相关推荐
- Spark GraphX 中的PageRank算法、pregel函数、航班飞行网图分析
PageRank算法 PageRank算法原理剖析及Spark实现 - 简书 (jianshu.com) import org.apache.spark.SparkContext import org ...
- Spark项目模拟——航班飞行网图分析
文章目录 Spark项目模拟--航班飞行网图分析 需求描述 数据准备 需求思路整理 代码实现 总结 机场数量: 航线数量: 最大的边属性: 哪个机场到达航班最多: 找出最重要的飞行航线: 找出最便宜的 ...
- Spark GraphX-航班飞行网图分析
文章目录 1.如下图所示的航班表,解决以下问题: 2.思路如下: 3.代码如下: 4.代码如下: 1.如下图所示的航班表,解决以下问题: 统计航班飞行网图中机场的数量 统计航班飞行网图中航线的数量 计 ...
- 项目实战 航班飞行网图分析
数据资料提取的地点 链接:https://pan.baidu.com/s/1WZlECyIjDyMwdVeyY2Gfqg 提取码:1111 训练的技能点 Spark GraphX API Spar ...
- sparkGraphx-航班飞行网图分析
文章目录 数据格式 构建航班飞行网图 数据格式 文件格式为CSV,字段之间分隔符为"," 依次为:#日.周#.航空公司.飞机注册号.航班号.起飞机场编号.起飞机场.到达机场编号.到 ...
- 大数据Spark SQL慕课网日志分析
第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目中涉及的Hadoop. ...
- Spark GraphX学习笔记
概述 GraphX是 Spark中用于图(如Web-Graphs and Social Networks)和图并行计算(如 PageRank and Collaborative Filtering)的 ...
- 明风:分布式图计算的平台Spark GraphX 在淘宝的实践
快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...
- GraphX:基于Spark的弹性分布式图计算系统
1 引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 1.1 图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,G ...
最新文章
- 完全理解 Python 迭代对象、迭代器、生成器(转)
- 简述人工智能的发展历程图_简述墙体彩绘机发展历程
- feed流和瀑布流_产品PM必备的Feed流和瀑布流应用场景
- python 写入第二列_python读写Excel表格的实例代码(简单实用)
- bzoj4380[POI2015]Myjnie dp
- Axis2;wsdl生成客户端和serverJava代码
- springmvc框架原理分析
- java基础学完_学完Java基础应该继续学什么?
- Centos7安装vlc
- Tomcat6.0连接器源码分析3
- RPM-GPG-KEY在包安装时候的作用
- UG NX 12 视图操作
- WPS文字中的某些内容下方出现的红色波浪线怎么去掉?
- steam无法连接至计算机,无法连接至steam网络怎么办 无法连接至steam网络解决方法【图文】...
- 前台离岗提示语_安全温馨提示语大全.doc
- 广域网加速方案--Riverbed
- 【图灵学院】JAVA互联网架构【全】
- zabbix最新数据中,没有值 45653:20211111:181222.474 [Z3005] query failed: [1526] Unknown error 1526 [insert in
- 提高php代码质量 36计
- 软件破解简单示例演示