import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD
val vertexArray = Array(
(1L, ("Alice", 28)),
(2L, ("Bob", 27)),
(3L, ("Charlie", 65)),
(4L, ("David", 42)),
(5L, ("Ed", 55)),
(6L, ("Fran", 50)),
(7L, ("Tian", 55))
)
//边的数据类型ED:Int
val 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),
Edge(7L, 3L, 8),
Edge(7L, 6L, 3),
Edge(7L, 6L, 6)
)
val vertexRDD: RDD[(Long, (String, Int))] = sc.parallelize(vertexArray)
val edgeRDD: RDD[Edge[Int]] = sc.parallelize(edgeArray)
val graph: Graph[(String, Int), Int] = Graph(vertexRDD, edgeRDD)

scala> import scala.collection.immutable.HashSet
import scala.collection.immutable.HashSet

获取顶点3的首度邻居

scala> val firstNeighbor=graph.aggregateMessages[Int](triplet=>{if(triplet.srcId==3) triplet.sendToDst(1)},(a,b)=>a )
firstNeighbor: org.apache.spark.graphx.VertexRDD[Int] = VertexRDDImpl[21] at RDD at VertexRDD.scala:57

scala> var fistids=new HashSet[Long]()
fistids: scala.collection.immutable.HashSet[Long] = Set()

scala> firstNeighbor.collect.foreach(a=>fistids+=a._1)

顶点3的首度邻居列表如下
scala> fistids
res1: scala.collection.immutable.HashSet[Long] = Set(6, 2)

边信息如下:

Edge(3L, 2L, 4),
Edge(3L, 6L, 3),

可以确定首度邻居为2,6

对顶点3的首度邻居进行循环获取二度邻居的顶点ID列表

scala> var secondids=new HashSet[Long]()
secondids: scala.collection.immutable.HashSet[Long] = Set()

scala> fistids.foreach(a=>{val secondneibors=graph.aggregateMessages[Int](trp=>{if(trp.srcId==a) trp.sendToDst(1)},(a,b)=>a);secondneibors.collect.foreach(a=>{secondids+=a._1})})

scala> secondids
res7: scala.collection.immutable.HashSet[Long] = Set(1, 4)

根据边可以看出,6没有出度

2的出度为1和4

获取二度邻居的信息

scala> graph.vertices.filter(a=>secondids.contains(a._1)).collect
res8: Array[(org.apache.spark.graphx.VertexId, (String, Int))] = Array((1,(Alice,28)), (4,(David,42)))

获取一度二度关系

scala> graph.vertices.filter(a=>secondids.contains(a._1) || fistids.contains(a._1)).collect
res10: Array[(org.apache.spark.graphx.VertexId, (String, Int))] = Array((1,(Alice,28)), (2,(Bob,27)), (4,(David,42)), (6,(Fran,50)))

----------------------------------------

顶点2的入度出度邻居

scala> graph.collectNeighbors(EdgeDirection.Either).filter(_._1==2).map(_._2).collect
res15: Array[Array[(org.apache.spark.graphx.VertexId, (String, Int))]] = Array(Array((1,(Alice,28)), (4,(David,42)), (3,(Charlie,65)), (5,(Ed,55))))

顶点2的入度邻居

scala> graph.collectNeighbors(EdgeDirection.In).filter(_._1==2).map(_._2).collect
res16: Array[Array[(org.apache.spark.graphx.VertexId, (String, Int))]] = Array(Array((3,(Charlie,65)), (5,(Ed,55))))

顶点2的出度邻居

scala> graph.collectNeighbors(EdgeDirection.Out).filter(_._1==2).map(_._2).collect
res17: Array[Array[(org.apache.spark.graphx.VertexId, (String, Int))]] = Array(Array((1,(Alice,28)), (4,(David,42))))

------------------------------------------------------

其他方式 获取二度出度邻居

scala> val firstNids=graph.collectNeighborIds(EdgeDirection.Out).filter(_._1==3).map(a=>a._2).first
firstNids: Array[org.apache.spark.graphx.VertexId] = Array(2, 6)

scala> graph.collectNeighbors(EdgeDirection.Out).filter(a=>firstNids.contains(a._1)).map(_._2).filter(_.length>0).first
res116: Array[(org.apache.spark.graphx.VertexId, (String, Int))] = Array((1,(Alice,28)), (4,(David,42)))

--------------------------------------------------

获取双向二度邻居

获取顶点3的邻居ID列表

scala> val firstNids=graph.collectNeighborIds(EdgeDirection.Either).filter(_._1==3).map(a=>a._2).first
firstNids: Array[org.apache.spark.graphx.VertexId] = Array(2, 6, 5, 7)

获取首度邻居顶点的邻居,生成一个多维数组,使用reduce 合并多维数组为一维数组并去重,然后将顶点3以及顶点3的邻居过滤掉获取二度邻居

scala> graph.collectNeighbors(EdgeDirection.Either).filter(a=>firstNids.contains(a._1)).map(_._2).reduce((a,b)=>a++b).distinct.filter(a=>{!firstNids.contains(a._1) && a._1!=3 })
res155: Array[(org.apache.spark.graphx.VertexId, (String, Int))] = Array((1,(Alice,28)), (4,(David,42)))

Graphx二度关系的更多相关文章

  1. 基于Spark GraphX计算二度关系

    关系计算问题描述 二度关系是指用户与用户通过关注者为桥梁发现到的关注者之间的关系.目前微博通过二度关系实现了潜在用户的推荐.用户的一度关系包含了关注.好友两种类型,二度关系则得到关注的关注.关注的好友 ...

  2. Spark 计算人员二度关系

    1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...

  3. Hadoop MapReduce实现人员二度关系运算

    1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...

  4. 海量数据的二度人脉挖掘算法(Hadoop 实现)

    最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐:简单描述:即你关注的人中有N个人同时都关注了 XXX . 在程序的实现上,其实我们要找的是:若 U ...

  5. Spark 计算人员三度关系

    1.一度人脉:双方直接是好友 2.二度人脉:双方有一个以上共同的好友,这时朋友网可以计算出你们有几个共同的好友并且呈现数字给你.你们的关系是: 你->朋友->陌生人 3.三度人脉:即你朋友 ...

  6. MapReduce实现二度好友关系

    一.问题定义 我在网上找了些,关于二度人脉算法的实现,大部分无非是通过广度搜索算法来查找,犹豫深度已经明确了2以内:这个算法其实很简单,第一步找到你关注的人:第二步找到这些人关注的人,最后找出第二步结 ...

  7. GraphX实现N度关系

    背景 本文给出了一个简单的计算图中每一个点的N度关系点集合的算法,也就是N跳关系. 之前通过官方文档学习和理解了一下GraphX的计算接口. N度关系 目标: 在N轮里.找到某一个点的N度关系的点集合 ...

  8. SparkGraphx计算指定节点的N度关系节点

    直接上代码: package horizon.graphx.util import java.security.InvalidParameterException import horizon.gra ...

  9. 使用MapReduce实现二度人脉搜索算法

    一,背景介绍 在新浪微博.人人网等社交网站上,为了使用户在网络上认识更多的朋友,社交网站往往提供类似“你可能感兴趣的人”.“间接关注推荐”等好友推荐的功能,其中就包含了二度人脉算法. 二,算法实现 原 ...

  10. 依据二度人脉推荐好友sql

    friend表结构 DROP TABLE IF EXISTS FRIEND; create table friend(     uid        bigint not null comment ' ...

随机推荐

  1. Maxim遍历测试工具(monkey升级版)

    Maxim 对应GitHub地址:https://github.com/zhangzhao4444/Maxim,其是对Android monkey的改进工具.是基于遍历规则和高性能要求. 条件准备: ...

  2. MySQL 常用命令(2)------数据库操作

    四.数据库操作 1.创建数据库 注意:创建数据库前要先连接mysql数据库 语法:create database <数据库名> 例:创建数据库并分配用户 1.create database ...

  3. js循环中删除数组中的某个元素

    (1)使用js中的splice方法循环删除数组中某个值 eg: var arr=new Array(); arr.push(1); arr.push(2); arr.push(3); arr.push ...

  4. 8.golang语言学习,运算符介绍

    1.算术运算 自增,自减,只能单独使用,++,--只能写在变量后面 2.赋值运算符 优先级,单目运算,赋值运算从右到左运算,其余从左到右,无三目运算,用if实现 3.比较运算符/关系 4.逻辑运算符 ...

  5. mongoDB日常操作01

    //serialno_info.i,查看历史最大值db.serialno_info.find({'_id':'define_picture'})//查看文件记录有序id条数db.fs.files.fi ...

  6. fio - IO测试工具

    目前主流的第三方IO测试工具有fio.iometer和Orion,这三种工具各有千秋. fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的 ...

  7. 「SOL」旧试题 (LOJ/SDOI)

    数论+图论,妙不可言 # 题面 给定 \(A,B,C\),求: \[\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma_0(ijk) \] 数据规模:\(A,B,C\ ...

  8. 第二章:用Python对不同的商品销售数据进行预测分析

    文章目录 项目背景 获取数据 线性数据预测 非线性数据预测 源码地址 本文分享知识: os 模块获取上一级目录的绝对地址 pands 读取 sqlite3 数据库中的数据 用sklearn中的线性回归 ...

  9. 如何在matlab中快速绘制一个函数的图像

    在malab绘制曲线图,并在x,y轴上加上说明 直接贴代码 clear,clck=1:1:10;y1=pi./atan(sqrt(k))-1;plot(k,y1)xlabel('Rz');ylabel ...

  10. Flutter 新建项目

    一.打开VSCode,点击侧边栏扩展按钮,搜索flutter,安装Flutter和Dart 二.按command+shift+P,输入flutter,选择Flutter:New project,新建项 ...