7. 图的聚合操作

图的聚合操作主要的方法有:

(1) Graph.mapReduceTriplets():该方法有一个mapFunc和一个reduceFunc,mapFunc对图中的每一个EdgeTriplet进行处理,生成一个或者多个消息,并且将这些消息发送个Edge的一个或者两个顶点,reduceFunc对发送到每一个顶点上的消息进行合并,生成最终的消息,最后返回一个VertexRDD(不包括没有收到消息的顶点);

(2) Graph.pregel():该方法采用BSP模型,包括三个函数vprog、sendMsg和mergeMsg,vprog是运行在每个节点上的顶点更新函数,接收消息,然后对顶点属性更新,sendMsg生成发送给下一次迭代的消息,mergeMsg对同一个顶点接收到的多个消息进行合并,迭代一直进行到收敛,或者达到了设置的最大迭代次数为止。

代码:

    // 聚合操作
println("*************************************************************")
println("聚合操作")
println("*************************************************************")
println("找出年纪最大的追求者:")
val oldestFollower:VertexRDD[(String,Int)] = userGraph.mapReduceTriplets[(String,Int)](
// 将源顶点的属性发送给目标顶点,map过程
edge => Iterator((edge.dstId,(edge.srcAttr.name,edge.srcAttr.age))),
// 得到最大追求者,reduce过程
(a,b) => if(a._2>b._2) a else b
)
userGraph.vertices.leftJoin(oldestFollower){(id,user,optOldestFollower) =>
optOldestFollower match{
case None => s"${user.name} does not have any followers."
case Some(oldestAge) => s"The oldest age of ${user.name} \'s followers is ${oldestAge._2}(${oldestAge._1})."
}
}.collect.foreach{case(id,str) => println(str)}
println // 找出追求者的平均年龄
println("找出追求者的平均年龄:")
val averageAge:VertexRDD[Double] = userGraph.mapReduceTriplets[(Int,Double)](
// 将源顶点的属性(1,Age)发送给目标顶点,map过程
edge => Iterator((edge.dstId,(1,edge.srcAttr.age.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)}
println // 聚合操作2
println("*************************************************************")
println("聚合操作2")
println("*************************************************************")
println("找出3到各顶点的最短距离:")
// 定义源点
val sourceId:VertexId = 3L
val initialGraph = graph.mapVertices((id,_) => if(id==sourceId) 0.0 else Double.PositiveInfinity)
val sssp = 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"))

运行结果:

*************************************************************
聚合操作
*************************************************************
找出年纪最大的追求者:
The oldest age of Peter 's followers is 27(Henry).
The oldest age of Kate 's followers is 55(Charlie).
The oldest age of Henry 's followers is 55(Charlie).
The oldest age of Alice 's followers is 32(Peter).
The oldest age of Charlie 's followers is 35(Mike).
Mike does not have any followers. 找出追求者的平均年龄:
The average age of Peter 's followers is 27.0.
The average age of Kate 's followers is 45.0.
The average age of Henry 's followers is 45.0.
The average age of Alice 's followers is 29.5.
The average age of Charlie 's followers is 35.0.
Mike does not have any followers. *************************************************************
聚合操作2
*************************************************************
找出3到各顶点的最短距离:
(4,9.0)
(6,3.0)
(2,7.0)
(1,10.0)
(3,0.0)
(5,Infinity)

Spark GraphX实例(3)的更多相关文章

  1. Spark GraphX实例(1)

    Spark GraphX是一个分布式的图处理框架.社交网络中,用户与用户之间会存在错综复杂的联系,如微信.QQ.微博的用户之间的好友.关注等关系,构成了一张巨大的图,单机无法处理,只能使用分布式图处理 ...

  2. Spark GraphX实例(2)

    5. 图的转换操作 图的转换操作主要有以下的方法: (1) Graph.mapVertices():对图的顶点进行转换,返回一张新图: (2) Graph.mapEdges():对图的边进行转换,返回 ...

  3. 大数据技术之_19_Spark学习_05_Spark GraphX 应用解析 + Spark GraphX 概述、解析 + 计算模式 + Pregel API + 图算法参考代码 + PageRank 实例

    第1章 Spark GraphX 概述1.1 什么是 Spark GraphX1.2 弹性分布式属性图1.3 运行图计算程序第2章 Spark GraphX 解析2.1 存储模式2.1.1 图存储模式 ...

  4. Spark GraphX图处理编程实例

    所构建的图如下: Scala程序代码如下: import org.apache.spark._ import org.apache.spark.graphx._ // To make some of ...

  5. 1. Spark GraphX概述

    1.1 什么是Spark GraphX Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求.那么什么是图 ...

  6. 转载:Spark GraphX详解

    1.GraphX介绍 1.1 GraphX应用背景 Spark GraphX是一个分布式图处理框架,它是基于Spark平台提供对图计算和图挖掘简洁易用的而丰富的接口,极大的方便了对分布式图处理的需求. ...

  7. Spark GraphX从入门到实战

      第1章 Spark GraphX 概述 1.1 什么是 Spark GraphX   Spark GraphX 是一个分布式图处理框架,它是基于 Spark 平台提供对图计算和图挖掘简洁易用的而丰 ...

  8. Spark + GraphX + Pregel

    Spark+GraphX图 Q:什么是图?图的应用场景 A:图是由顶点集合(vertex)及顶点间的关系集合(边edge)组成的一种网状数据结构,表示为二元组:Gragh=(V,E),V\E分别是顶点 ...

  9. Spark—GraphX编程指南

    Spark系列面试题 Spark面试题(一) Spark面试题(二) Spark面试题(三) Spark面试题(四) Spark面试题(五)--数据倾斜调优 Spark面试题(六)--Spark资源调 ...

随机推荐

  1. python+selenium八:Alert弹窗

    此弹窗是浏览器自带的弹窗,不是html中的元素 from selenium import webdriverfrom selenium.webdriver.common.action_chains i ...

  2. python 全栈开发,Day122(人工智能初识,百度AI)

    一.人工智能初识 什么是智能? 我们通常把人成为智慧生物,那么”智慧生物的能力”就是所谓的”智能”我们有什么能力?听,说,看,理解,思考,情感等等 什么是人工智能? 顾名思义就是由人创造的”智慧能力” ...

  3. python 全栈开发,Day96(Django REST framework 视图,django logging配置,django-debug-toolbar使用指南)

    昨日内容回顾 1. Serializer(序列化) 1. ORM对应的query_set和ORM对象转换成JSON格式的数据 1. 在序列化类中定义自定义的字段:SerializerMethodFie ...

  4. DDD领域模型数据访问权限之用户权限(十)

    BAS_PRService岗位和角色服务: public class BAS_PRService { //岗位 private IRepository<BAS_Post> ireposit ...

  5. JSON.NET 空值处理, 数字转字符,时间格式化

    public static string ToJsonString(this Object obj) { IsoDateTimeConverter idtc = new IsoDateTimeConv ...

  6. poj1743

    题解: 后缀数组+二分答案 首先会发现这题实质上就是求最长不重复的相同子段 首先二分答案长度,之后对每一段信息进行维护 一段信息即保证这一段的sa值都大于mid即可 然后找到这段中后缀位置最大和最小处 ...

  7. 【Java】 剑指offer(3) 二维数组中的查找

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...

  8. Docker镜像优化

    前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerfile的优劣. 一.以往Dockerfile构建模 ...

  9. C#窗体向另一个窗体实时传值及传值问题

    C#窗体向另一个窗体实时传值  另外的传值方法:

  10. BZOJ.2879.[NOI2012]美食节(费用流SPFA)

    题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...