1.测试文件

A:B,C,D,F,E,O

B:A,C,E,K

C:F,A,D,I

D:A,E,F,L

E:B,C,D,M,L

F:A,B,C,D,E,O,M

G:A,C,D,E,F

H:A,C,D,E,O

I:A,O

J:B,O

K:A,C,D

L:D,E,F

M:E,F,G

O:A,H,I,J

2.方法

2-1.方法一:

1.将域用户和好友分别作为值和键输出
{B,C,D,F,E,O}:A
{A,C,E,K}:B 2.可以看出:B,C,D,F,E,O都有共同好友A, 3.把A的好友两两组合作为键,A作为值,冒泡输出 4.经过shuffle处理后,会把BC作为键,共同好友作为值放入集合中 5.迭代集合中的好友,一次输出即可

2-2.方法二:

1.将用户和好友作为键和值输出

  A:B,C,D,F,E,O     --A:B,C,D,F,E,O
B:A,C,E,K --B:A,C,E,K
C:F,A,D,I --C:A,D,F,I
D:A,E,F,L --D:A,E,F,L
E:B,C,D,M,L --E:B,C,D,L,M 2.将所有键值对添加到map集合中 3.取map的键(所有用户)为数组 4.迭代数组,通过用户名"A"在map中取得他的好友 5.迭代除用户"A"以外的其他用户,获取这些用户的好友; 如果有用户同时存在于"A"和"B"的好友列表中 那么这些好友就是"AB"的共同好友 --A:{B,C,D,F,E,O}
--B:{A,C,E,K} "A"中存在"C,E"用户,"B"中也存在"C,E"用户,那么"C,E"就是AB的共同好友 6.将"AB"作为键,共同好友作为值输出即可

3.代码

public class Friends {

    // map
public static class MRMapper extends Mapper<LongWritable, Text, Text, Text> { protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String str = value.toString();
String friends = str.substring(2);
System.out.println(friends);
context.write(new Text(str.charAt(0) + ""), new Text(friends));
}
} // reduce
public static class MRReducer extends Reducer<Text, Text, Text, Text> { private static HashMap<String, String> map1 = new HashMap<String, String>();
public void run(Context context) throws IOException, InterruptedException {
try {
while (context.nextKeyValue()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
} finally {
cleanup(context);
}
} public void reduce(Text key, Iterable<Text> iterable, Context context)
throws IOException, InterruptedException { for (Text t : iterable) {
map1.put(key.toString(), t.toString());
}
} public void cleanup(Reducer<Text, Text, Text, Text>.Context context)
throws IOException, InterruptedException { List<String> list = new ArrayList<String>(); Collection<String> keys = map1.keySet();// 所有用户 String keys1 = keys.toString(); String keys2 = keys1.substring(1, keys1.length() - 1); String[] split = keys2.split(","); for (int i = 1; i < split.length; i++) {//迭代用户 String a = split[i].trim(); for (int j = (i+1); j < split.length; j++) {//迭代除外层循环以外的用户 String b = split[j].trim(); String a_and_b = ""; // a的好友
String af = map1.get(a); String[] friends = af.split(","); for (String s : friends) {//比较两个用户的好友列表,取共同好友 if (map1.get(b).contains(s)) { a_and_b += "," + s;
}
} System.out.println(a + "," + b + " 共同好友 " + a_and_b); if (a_and_b.length() > 1) { list.add(a + "," + b + " 共同好友 :" + a_and_b.substring(1));
}
}
}
for(String s:list){ context.write(new Text(""), new Text(s));
}
}
} public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf);
job.setJarByClass(Friends.class); job.setMapperClass(MRMapper.class);
job.setReducerClass(MRReducer.class);
job.setCombinerClass(MRReducer.class); job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); FileInputFormat.setInputPaths(job, new Path("hdfs://hadoop5:9000/input/friends.txt"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://hadoop5:9000/output/friends")); System.out.println(job.waitForCompletion(true) ? 1 : 0);
}
}

如果有更简洁的方法,欢迎留言给博主。

MapReduce寻找共同好友的更多相关文章

  1. python版mapreduce题目实现寻找共同好友

    看到一篇不知道是好好玩还是好玩玩童鞋的博客,发现一道好玩的mapreduce题目,地址http://www.cnblogs.com/songhaowan/p/7239578.html 如图 由于自己太 ...

  2. 用Mapreduce求共同好友

    import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...

  3. mapreduce 查找共同好友

    A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E:B,C,D,M,L F:A,B,C,D,E,O,M G:A,C,D,E,F H:A,C,D,E,O I:A, ...

  4. mapreduce求共同好友

    逻辑分析 以下是qq的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E,F,L E: ...

  5. MapReduce案例-好友推荐

    用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...

  6. 大数据入门第九天——MapReduce详解(五)mapJoin、GroupingComparator与更多MR实例

    一.数据倾斜分析——mapJoin 1.背景 接上一个day的Join算法,我们的解决join的方式是:在reduce端通过pid进行串接,这样的话: --order ,,P0001, ,,P0001 ...

  7. 中国移动飞信WAP登陆分析及脚本

    中国移动飞信WAP网页版 http://f.10086.cn/im5/ 用WAP飞信登录并向好友发送信息,同时用wireshark抓包. 1.过滤POST表单提交数据包(wireshark规则: ht ...

  8. MapReduce实现二度好友关系

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

  9. 基于mapreduce的大规模连通图寻找算法

    基于mapreduce的大规模连通图寻找算法 当我们想要知道哪些账号是一个人的时候往往可以通过业务得到两个账号之间有联系,但是这种联系如何传播呢? 问题 已知每个账号之间的联系 如: A B B C ...

随机推荐

  1. SAP HANA中的SLT简介

    在以SAP系统作为主要ERP的企业中,不同系统之间的数据库数据同步是个重要的工作.对于这种需求,除了开发ABAP接口之外,也有高效的工具可用.SLT就是其中之一. SLT是SAP的第一个ETL(Ext ...

  2. div外观例子

    title: div外观例子 date: 2018-1-15 14:00:00 tags: 前端 div css categories: 前端框架 --- 标题 我的标题 内容 Font Awesom ...

  3. MVVMLight 1:MVVMLight介绍以及在项目中的使用

    一.MVVM 和 MVVMLight介绍 MVVM是Model-View-ViewModel的简写.类似于目前比较流行的MVC.MVP设计模式,主要目的是为了分离视图(View)和模型(Model)的 ...

  4. HihoCoder 1325 平衡树·Treap

    HihoCoder 1325 平衡树·Treap 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,我发现我们以前讲过的两个数据结构特别相似. 小Hi:你说 ...

  5. meterpreter_paranoid_mode.sh允许用户安全上演/无级连接Meterpreter经检查合格证书的处理程序正在连接到

    刚刚看完即刻安全大咖的新姿势感觉很6逼,结果成功了meterpreter_paranoid_mode.sh允许用户安全上演/无级连接Meterpreter经检查合格证书的处理程序正在连接到. 我们开始 ...

  6. 水dp第二天(背包有关)

    水dp第二天(背包有关) 标签: dp poj_3624 题意:裸的01背包 注意:这种题要注意两个问题,一个是要看清楚数组要开的范围大小,然后考虑需要空间优化吗,还有事用int还是long long ...

  7. 什么是 core dump ? 以及如何使用gdb对 core dumped 进行调试

    什么是core dump?(down = 当) core的意思是:内存,dump的意思是:扔出来.堆出来. 开发和使用linux程序时,有时程序莫名其妙的down掉了,却没有任何的提示(有时候会提示c ...

  8. Spring框架学习笔记(7)——代理对象实现AOP

    AOP(面向切面编程) AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming ...

  9. 【JAVA】hashcode() & equals()

    平时使用map时都是用JAVA原生的类型,所以很少关注到hashcode()和equals()的方法的内部实现.近期实现一个小工具,涉及到自己写的类的查找比对,又再次重温了相关的知识. 上简单示例代码 ...

  10. centos7 hue安装

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...