目录

一、数据

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

二、需求

  1. 构造fans网图。
  2. 找出年龄大于30岁的顶点。
  3. 找出边属性大于5的边。
  4. 将每个顶点的年龄+20。
  5. 将边的属性*3。
  6. 找出顶点年龄大于30的子图。
  7. 创建以User作为顶点的新图。
  8. 找出年纪最大的追求者。
  9. 计算追求者的平均年纪。
  10. 找出顶点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】社交网图分析相关推荐

  1. Spark GraphX 中的PageRank算法、pregel函数、航班飞行网图分析

    PageRank算法 PageRank算法原理剖析及Spark实现 - 简书 (jianshu.com) import org.apache.spark.SparkContext import org ...

  2. Spark项目模拟——航班飞行网图分析

    文章目录 Spark项目模拟--航班飞行网图分析 需求描述 数据准备 需求思路整理 代码实现 总结 机场数量: 航线数量: 最大的边属性: 哪个机场到达航班最多: 找出最重要的飞行航线: 找出最便宜的 ...

  3. Spark GraphX-航班飞行网图分析

    文章目录 1.如下图所示的航班表,解决以下问题: 2.思路如下: 3.代码如下: 4.代码如下: 1.如下图所示的航班表,解决以下问题: 统计航班飞行网图中机场的数量 统计航班飞行网图中航线的数量 计 ...

  4. 项目实战 航班飞行网图分析

    数据资料提取的地点 链接:https://pan.baidu.com/s/1WZlECyIjDyMwdVeyY2Gfqg  提取码:1111  训练的技能点 Spark GraphX API Spar ...

  5. sparkGraphx-航班飞行网图分析

    文章目录 数据格式 构建航班飞行网图 数据格式 文件格式为CSV,字段之间分隔符为"," 依次为:#日.周#.航空公司.飞机注册号.航班号.起飞机场编号.起飞机场.到达机场编号.到 ...

  6. 大数据Spark SQL慕课网日志分析

    第1章 初探大数据 本章将介绍为什么要学习大数据.如何学好大数据.如何快速转型大数据岗位.本项目实战课程的内容安排.本项目实战课程的前置内容介绍.开发环境介绍.同时为大家介绍项目中涉及的Hadoop. ...

  7. Spark GraphX学习笔记

    概述 GraphX是 Spark中用于图(如Web-Graphs and Social Networks)和图并行计算(如 PageRank and Collaborative Filtering)的 ...

  8. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

  9. GraphX:基于Spark的弹性分布式图计算系统

    1 引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 1.1    图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,G ...

最新文章

  1. 完全理解 Python 迭代对象、迭代器、生成器(转)
  2. 简述人工智能的发展历程图_简述墙体彩绘机发展历程
  3. feed流和瀑布流_产品PM必备的Feed流和瀑布流应用场景
  4. python 写入第二列_python读写Excel表格的实例代码(简单实用)
  5. bzoj4380[POI2015]Myjnie dp
  6. Axis2;wsdl生成客户端和serverJava代码
  7. springmvc框架原理分析
  8. java基础学完_学完Java基础应该继续学什么?
  9. Centos7安装vlc
  10. Tomcat6.0连接器源码分析3
  11. RPM-GPG-KEY在包安装时候的作用
  12. UG NX 12 视图操作
  13. WPS文字中的某些内容下方出现的红色波浪线怎么去掉?
  14. steam无法连接至计算机,无法连接至steam网络怎么办 无法连接至steam网络解决方法【图文】...
  15. 前台离岗提示语_安全温馨提示语大全.doc
  16. 广域网加速方案--Riverbed
  17. 【图灵学院】JAVA互联网架构【全】
  18. zabbix最新数据中,没有值 45653:20211111:181222.474 [Z3005] query failed: [1526] Unknown error 1526 [insert in
  19. 提高php代码质量 36计
  20. 软件破解简单示例演示

热门文章

  1. Gaze vector介绍
  2. tableau:盒须图
  3. sentencepiece原理与实践
  4. 云呐:资产密集型企业固定资产管理系统的基本功能特点
  5. 【渝粤教育】21秋期末考试国际私法10216k1
  6. json数据和json数据与python之间的转换
  7. 使众人行:如何带领一群人把事做成?
  8. 免费好用的数据可视化软件工具
  9. International Classification for Standards 国际标准分类号
  10. 什么是分布式微服务架构?三分钟彻底弄懂什么是分布式和微服务