MapReduce寻找共同好友
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寻找共同好友的更多相关文章
- python版mapreduce题目实现寻找共同好友
看到一篇不知道是好好玩还是好玩玩童鞋的博客,发现一道好玩的mapreduce题目,地址http://www.cnblogs.com/songhaowan/p/7239578.html 如图 由于自己太 ...
- 用Mapreduce求共同好友
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...
- 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, ...
- 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: ...
- MapReduce案例-好友推荐
用过各种社交平台(如QQ.微博.朋友网等等)的小伙伴应该都知道有一个叫 "可能认识" 或者 "好友推荐" 的功能(如下图).它的算法主要是根据你们之间的共同好友 ...
- 大数据入门第九天——MapReduce详解(五)mapJoin、GroupingComparator与更多MR实例
一.数据倾斜分析——mapJoin 1.背景 接上一个day的Join算法,我们的解决join的方式是:在reduce端通过pid进行串接,这样的话: --order ,,P0001, ,,P0001 ...
- 中国移动飞信WAP登陆分析及脚本
中国移动飞信WAP网页版 http://f.10086.cn/im5/ 用WAP飞信登录并向好友发送信息,同时用wireshark抓包. 1.过滤POST表单提交数据包(wireshark规则: ht ...
- MapReduce实现二度好友关系
一.问题定义 我在网上找了些,关于二度人脉算法的实现,大部分无非是通过广度搜索算法来查找,犹豫深度已经明确了2以内:这个算法其实很简单,第一步找到你关注的人:第二步找到这些人关注的人,最后找出第二步结 ...
- 基于mapreduce的大规模连通图寻找算法
基于mapreduce的大规模连通图寻找算法 当我们想要知道哪些账号是一个人的时候往往可以通过业务得到两个账号之间有联系,但是这种联系如何传播呢? 问题 已知每个账号之间的联系 如: A B B C ...
随机推荐
- Java设计模式总汇二(小白也要飞)
PS:上一篇我介绍了适配器设计模式.单例设计模式.静态代理设计模式.简单工厂设计模式,如果没有看过第一篇的小火鸡可以点这个看看http://www.cnblogs.com/cmusketeer/p/8 ...
- 【转载】MySQL · 性能优化· InnoDB buffer pool flush策略漫谈
背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数个内存块加上一组控制结构体对象组成.内存块的个数取决于buffer pool inst ...
- Pandas系列之入门篇
Pandas系列之入门篇 简介 pandas 是 python用来数据清洗.分析的包,可以使用类sql的语法方便的进行数据关联.查询,属于内存计算范畴, 效率远远高于硬盘计算的数据库存储.另外pand ...
- es6 的循环
for-of 循环 for-of 不能直接用来遍历对象的属性,如果你想遍历对象的属性,你可以使用 for-in 语句(for-in 就是用来干这个的),或者使用下面的方式: for (let key ...
- 生成器&迭代器
通过列表生成式,我们可以快速创建一个列表,但是受到内存的限制,列表容量是有限的,而且一个包含100万个元素的列表不仅占用很大的存储空间,如果我们仅仅需要访问当前几个元素,那后面绝大多数元素占用的空间都 ...
- JSP最常用的五种内置对象(out,request,response,session,application)
为了简化开发过程,JSP提供了一些内置对象,它们由容器实现和管理.开发者在JSP页面中无需声明,无需实例化就可使用.主要有out,request,response,session,applicatio ...
- Effective Java 第三版——21. 为后代设计接口
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- Git知识总览(三) 分支的创建、删除、切换、合并以及冲突解决
前两篇博客集中的聊了git的一些常用命令,具体请参见<Git知识总览(一) 从 git clone 和 git status 谈起>.<Git知识总览(二) git常用命令概览> ...
- Redux 核心概念
http://gaearon.github.io/redux/index.html ,文档在 http://rackt.github.io/redux/index.html .本文不是官方文档的翻译. ...
- 【一小时入门】webpack 入门指南
什么是 webpack? webpack是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS(含JSX).coffee.样式(含less/sass).图片等都作为模块来使用和处理. 我们可以 ...