1、一度人脉:双方直接是好友

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

3、三度人脉:即你朋友的朋友的朋友就是这个陌生人。你们的关系是 你->朋友->朋友->陌生人

4、四度人脉:比三度增加一度,你们的关系是,你->朋友->朋友->朋友->陌生人

5、五度人脉:你->朋友->朋友->朋友->朋友->陌生人 ,像上面这张图片表示的就是一个五度人脉关系。

6、六度人脉:你->朋友->朋友->朋友->朋友->朋友->陌生人

数据格式如下:

A,B
A,C
A,E
B,D
E,D
C,F
F,G

业务逻辑如下:

1、转换操作flatMapToPair将行数据变为键值对,如A,B表示A和B认识,A可以通过B认识B的朋友,B通过A可以认识A的朋友,转化结果为{A:A,B}、{B:B,A};

2、转换操作groupByKey对键值对按Key进行分组,转化结果为:{A,【A,BA,E A,C 】}...;

3、转成操作flatMapToPair生成包含可能存在(A->B,A->C两者走向B和C不相同,B和C即存在可能)二度关系的新的键值对,如A和B认识且A与C认识,那么B与C可以存在认识关系即二度关系,路线走向为:B->A->C;

4、转成操作filter在新的键值对中筛选出一度关系即两者已经是认识的,如A和B认识是一度关系;

5、转成操作subtractByKey对包含二度关系的键值对删除存在一度关系的人员;

6、行为操作countByKey统计存在二度关系的比重;

具有实现:

package com.test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.MapFunction;
import org.apache.spark.api.java.function.PairFlatMapFunction;
import org.apache.spark.api.java.function.PairFunction; import scala.Tuple2; public class Test1 { public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("My Test APP"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> rdd = sc.textFile("C:/rmgx.txt"); JavaPairRDD<String, String> r1 = rdd.flatMapToPair(new PairFlatMapFunction<String,String,String>(){
@Override
public Iterator<Tuple2<String, String>> call(String t)
throws Exception {
List<Tuple2<String, String>> list = new ArrayList();
String[] eachterm = t.split(",");
list.add(new Tuple2(eachterm[0], eachterm[0] + "," + eachterm[1]));
list.add(new Tuple2(eachterm[1],eachterm[1] + "," + eachterm[0]));
return list.iterator();
}
}); JavaPairRDD<String, Iterable<String>> r2 = r1.groupByKey(); JavaPairRDD<String, String> r3 = r2.flatMapToPair(new PairFlatMapFunction<Tuple2<String,Iterable<String>>,String,String>(){
@Override
public Iterator<Tuple2<String, String>> call(
Tuple2<String, Iterable<String>> t) throws Exception {
List<Tuple2<String, String>> list = new ArrayList();
for (Iterator iter = t._2.iterator(); iter.hasNext();) {
String str1 = (String)iter.next();
String str1_0 = str1.split(",")[0];
String str1_1 = str1.split(",")[1];
list.add(new Tuple2(str1_0+ "->" + str1_1,"deg1friend,"+str1_0+ "->" + str1_1));
for (Iterator iter2 = t._2.iterator(); iter2.hasNext();) {
String str2 = (String)iter2.next();
String str2_0 = str2.split(",")[0];
String str2_1 = str2.split(",")[1];
if(!str1_1.equals(str2_1)){
list.add(new Tuple2(str1_1+ "->" + str2_1 ,"deg2friend,"+str1_1 + "->" + str2_0 + "->" + str2_1));
}
}
}
return list.iterator();
}
}); JavaPairRDD<String, String> r4 = r3.filter(new Function<Tuple2<String,String>,Boolean>(){
@Override
public Boolean call(Tuple2<String, String> v1) throws Exception {
return v1._2.indexOf("deg1friend")>-1;
}
}); JavaPairRDD<String, String> r5 = r3.subtractByKey(r4); System.out.println("线路走向:"+StringUtils.join(r5.collect(), ",")); Map<String, Long> r6 = r5.countByKey(); System.out.println("二度关系及比重:" + r6);
}
}

结果如下:

线路走向:(A->F,deg2friend,A->C->F),(F->A,deg2friend,F->C->A),(A->D,deg2friend,A->B->D),(A->D,deg2friend,A->E->D),(C->G,deg2friend,C->F->G),(C->E,deg2friend,C->A->E),(C->B,deg2friend,C->A->B),(G->C,deg2friend,G->F->C),(B->E,deg2friend,B->A->E),(B->E,deg2friend,B->D->E),(E->B,deg2friend,E->A->B),(E->B,deg2friend,E->D->B),(E->C,deg2friend,E->A->C),(B->C,deg2friend,B->A->C),(D->A,deg2friend,D->B->A),(D->A,deg2friend,D->E->A)
二度关系及比重:{F->A=1, C->G=1, A->D=2, B->E=2, E->B=2, C->B=1, C->E=1, B->C=1, G->C=1, D->A=2, A->F=1, E->C=1}

Spark 计算人员二度关系的更多相关文章

  1. Spark 计算人员三度关系

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

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

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

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

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

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

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

  5. MapReduce实现二度好友关系

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

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

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

  7. 【Spark深入学习 -13】Spark计算引擎剖析

    ----本节内容------- 1.遗留问题解答 2.Spark核心概念 2.1 RDD及RDD操作 2.2 Transformation和Action 2.3 Spark程序架构 2.4 Spark ...

  8. GraphX实现N度关系

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

  9. Spark计算模型

    [TOC] Spark计算模型 Spark程序模型 一个经典的示例模型 SparkContext中的textFile函数从HDFS读取日志文件,输出变量file var file = sc.textF ...

随机推荐

  1. luogu 4004 Hello world! 分块 + 并查集 + 乱搞

    其实呢,我也不理解这道题咋做,等以后有时间再研究研究 #include <bits/stdc++.h> #define ll long long #define maxn 100002 u ...

  2. HDU 6620 Just an Old Puzzle

    Time limit 2000 ms Memory limit 262144 kB OS Windows 解题过程 感觉搜索不可行,状态太多了,120步,判断状态是否重复时,即使用std::map也太 ...

  3. 【ELK】elasticsearch设置密码访问

    1.需要在配置文件中开启x-pack验证, 修改config目录下面的elasticsearch.yml文件,在里面添加如下内容,并重启. xpack.security.enabled: true x ...

  4. DB数据库的基本操作

    启动 MongoDB 服务 sudo service mongodb start 进入 MongoDB 命令行操作界面,在命令行中敲 exit 可以退出.mongo 创建数据库 use db 命令查看 ...

  5. IDEA设置Ctrl+滚轮调整字体大小

    IDEA设置Ctrl+滚轮调整字体大小(转载)   按Ctrl+Shift+A,出现搜索框 输入mouse: 点击打开这个设置:勾选 点击ok,之后就可以通过Ctrl+滚轮 调整字体大小了.

  6. C#中使用Join与GroupJoin将两个集合进行关联与分组

    转自:https://www.cnblogs.com/cncc/p/7985843.html 对于Join的用法说明如下: 语法: public static IEnumerable<TResu ...

  7. 服务器上安装搭建node环境

    一.版本 : node  v4.4.3 npm  v2.15.1 pm2  v1.1.3 express v4.13.4 二.node安装与环境配置 新建node安装目录,与node项目目录     ...

  8. 【转】Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)

    [转]Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128) ...

  9. Ajax的封装。

    封装 Ajax 因为Ajax 使用起来比较麻烦,主要就是参数问题,比如到底使用GET 还是POST:到 底是使用同步还是异步等等,我们需要封装一个Ajax 函数,来方便我们调用.    封装支持接收来 ...

  10. 【MongoDB】 windows下建立双机主从

    [双机配置] 服务端: 两台 Dell R730 双路E5 服务器 使用一个内网环境,网段20, ping 测试互通 主服ip: 192.168.20.176: 27017 从服ip: 192.168 ...