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 求出哪些人两两之间有共同好友,及他俩的共同好友都是谁
例如A-B:C,E
A-E:B,C,D

一种错误的理解就是E在A的还有列表中,那么A也在E的列表,且A和E同时有的好友才是共同好友

,如果按照这个观点思考下去就简单了,但是这个是错的,因为A-E:B,C,D 这种不不满足

正确的理解是求人与人之间的共同好友,人与人之间是否是同一个好友,是否在彼此的好友列表无关。

如果这个程序不用mapreduce做那么应该是先把人全部切分出来,然后循环进行人与人的组合,组合之后将他们好友列表组合,将那些出现两次的还有找到,这些就是人与人之间的共同还有,也是人工去找共同好友的方法,

但是放在mapreuce。,,每次只能读取一行数据不能都到他行的,如果要读到其他行的就要找到一个key然后还要将其他行的数据类聚一起,这样才能读到其他行。

如果知道答案的话,这样想的话就可以避免混淆了

tom: apple,pear,banana,waterball

jerry:apple,pear

jack:banana,apple

哪些人两两之间有共同的水果,列举出两人所有的共同水果。这样大家都不会混淆了。但是工作中遇到的就是人和好友的问题,大胆的抽象成人和水果也是工作中要做的

下面链接是答案

package my.hadoop.hdfs.findFriend;

import java.io.IOException;
import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser; public class FindCommonFriendOne { public static class FindFriendMapper extends
Mapper<LongWritable, Text, Text, Text> {
// 泛型,定义输入输出的类型
/**
* 友 人
*/
Text text = new Text(); @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 将mptask传给我们的文本内容转换成String
String line = value.toString();
IntWritable ONE = new IntWritable();
// 根据空格切分
String[] qqAndFriend = line.split(":");//分割出QQ号
String qq = qqAndFriend[];
String otherFriend = "";
StringBuffer friendbuf = new StringBuffer(qqAndFriend[]+","); String[] friends = qqAndFriend[].split(",");
for (String friend : friends) {
//查找其他朋友
//otherFriend = friendbuf.delete(friendbuf.indexOf(friend),friendbuf.indexOf(friend)+1).toString();
context.write(new Text(friend), new Text(qq));
}
}
} public static class FindFriendReducer extends
Reducer<Text, Text, Text, Text> { @Override
protected void reduce(Text Keyin, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
String qqs = "";
for (Text val : values) {
qqs +=val.toString() + ",";
}
context.write(Keyin, new Text(qqs));
}
} public static void main(String[] args) throws IOException,
ClassNotFoundException, InterruptedException { Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);
job.setJarByClass(FindCommonFriendOne.class); job.setMapperClass(FindFriendMapper.class);
job.setReducerClass(FindFriendReducer.class);
//指定最终输出的数据kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); FileInputFormat.setInputPaths(job, new Path(args[])); FileOutputFormat.setOutputPath(job, new Path(args[]));
boolean res = job.waitForCompletion(true);
System.exit(res ? :);
} }
package my.hadoop.hdfs.findFriend;

import java.io.IOException;
import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.CombineTextInputFormat;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser; public class FindCommonFriendTwo { public static class FindFriendMapper extends
Mapper<LongWritable, Text, Text, Text> {
// 泛型,定义输入输出的类型
/**
* 友 人
*/
Text text = new Text(); @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
// 将mptask传给我们的文本内容转换成String
String line = value.toString();
IntWritable ONE = new IntWritable();
// 根据空格切分
String[] friendAndQQ = line.split("\t");//分割出QQ号
String friend = friendAndQQ[];
String otherFriend = "";
StringBuffer friendbuf = new StringBuffer(friendAndQQ[] ); String[] qqs = friendAndQQ[].split(",");
for (int i=;i < qqs.length;i++) {
//查找其他朋友
for(int j = i+;j<qqs.length;j++)
{
//避免出现A-D 与D-A的情况
if(qqs[i].compareTo(qqs[j])>)
{
context.write(new Text(qqs[i]+"-"+qqs[j]), new Text(friend));
}
else{
context.write(new Text(qqs[j]+"-"+qqs[i]), new Text(friend));
} } }
}
} public static class FindFriendReducer extends
Reducer<Text, Text, Text, Text> { @Override
protected void reduce(Text Keyin, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
StringBuffer friends = new StringBuffer();
for (Text val : values) {
if(friends.indexOf(val.toString())<)
{
friends.append(val).append(",");
}
}
context.write(Keyin, new Text(friends.toString()));
}
} public static void main(String[] args) throws IOException,
ClassNotFoundException, InterruptedException { Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);
job.setJarByClass(FindCommonFriendTwo.class); job.setMapperClass(FindFriendMapper.class);
job.setReducerClass(FindFriendReducer.class);
//指定最终输出的数据kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); FileInputFormat.setInputPaths(job, new Path(args[])); FileOutputFormat.setOutputPath(job, new Path(args[]));
boolean res = job.waitForCompletion(true);
System.exit(res ? :);
} }
[hadoop@mini2 study]$ hadoop fs -cat /findfriend/output/tes0/*
A I,K,C,B,G,F,H,O,D,
B A,F,J,E,
C A,E,B,H,F,G,K,
D G,C,K,A,L,F,E,H,
E G,M,L,H,A,F,B,D,
F L,M,D,C,G,A,
G M,
H O,
I O,C,
J O,
K B,
L D,E,
M E,F,
O A,H,I,J,F,
[hadoop@mini2 study]$ hadoop fs -cat /findfriend/output/tes2/*
B-A E,C,
C-A F,D,
C-B A,
D-A E,F,
D-B A,E,
D-C F,A,
E-A D,C,B,
E-B C,
E-C D,
E-D L,
F-A C,O,D,E,B,
F-B C,A,E,
F-C A,D,
F-D E,A,
F-E C,B,M,D,
G-A E,D,C,F,
G-B E,A,C,
G-C D,F,A,
G-D A,E,F,
G-E D,C,
G-F C,A,E,D,
H-A O,E,C,D,
H-B E,C,A,
H-C D,A,
H-D E,A,
H-E C,D,
H-F C,D,A,E,O,
H-G C,A,E,D,
I-A O,
I-B A,
I-C A,
I-D A,
I-F A,O,
I-G A,
I-H A,O,
J-A B,O,
J-E B,
J-F O,B,
J-H O,
J-I O,
K-A D,C,
K-B A,C,
K-C D,A,
K-D A,
K-E C,D,
K-F D,C,A,
K-G D,C,A,
K-H C,D,A,
K-I A,
L-A E,D,F,
L-B E,
L-C D,F,
L-D F,E,
L-E D,
L-F D,E,
L-G E,F,D,
L-H E,D,
L-K D,
M-A F,E,
M-B E,
M-C F,
M-D F,E,
M-F E,
M-G E,F,
M-H E,
M-L E,F,
O-B A,
O-C I,A,
O-D A,
O-F A,
O-G A,
O-H A,
O-I A,
O-K A,

mapreduce系列(7)--查找共同好友

mapreduce 查找共同好友的更多相关文章

  1. 用Mapreduce求共同好友

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

  2. 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 ...

  3. 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: ...

  4. MapReduce案例-好友推荐

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

  5. hadoop系列四:mapreduce的使用(二)

    转载请在页首明显处注明作者与出处 一:说明 此为大数据系列的一些博文,有空的话会陆续更新,包含大数据的一些内容,如hadoop,spark,storm,机器学习等. 当前使用的hadoop版本为2.6 ...

  6. (转)OpenFire源码学习之七:组(用户群)与花名册(用户好友)

    转:http://blog.csdn.net/huwenfeng_2011/article/details/43413651 Group 在openfire中的gorop——组,也可以理解为共享组.什 ...

  7. 易货beta版本测试报告

    测试 对于服务器端我们是进行了单元测试 对于客户端我们使用的是在线的云测工具对app进行了包括安装,启动,具体功能以及ui方面的测试. 另外,对于客户端,我们还进行了对细节功能的人工测试 功能需求编号 ...

  8. 使用Redis来实现LBS的应用

    原文地址 微信.陌陌 架构方案分析 近两年.手机应用,莫过于微信.陌陌之类最受欢迎:但实现原理,分享文章甚少. 故,提出两种方案,供分享:不对之处,敬请留言学习. 目标 查找附近的某某某,由近到远返回 ...

  9. 《易货》Alpha版本测试报告

    一.测试计划 功能需求编号 功能需求名称 功能需求描述 测试计划 1 用户注册 每一个想要发布商品或者需要购买商品的用户都需要注册一个账号 √ 2 用户登录 已经拥有账号的用户登录 √ 3 密码修改 ...

随机推荐

  1. Flash3D学习计划(一)——3D渲染的一般管线流程

    一:什么是渲染管线 渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元.一个流水线是一序列可以并行和按照固定顺序进行的阶段.每个阶段都从它的前一阶段接收输入,然后把输出发给随后 ...

  2. AHOI 2009 中国象棋

    题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走 ...

  3. 3.1.g 找出在2009年秋季拥有最多选课人数的课程段

    3.1.g 找出在2009年秋季拥有最多选课人数的课程 3.1 使用大学模式,用SQL写出如下查询. g) 找出在2009年秋季拥有最多选课人数的课程段. 注:本题来自于 数据库系统概念 第六版 机械 ...

  4. socket第三方库 AsyncSocket(GCDAsyncSocket)

    Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...

  5. 【SQL】在SQL Server中多表关联查询问题

    好久没有写SQL语句的多表连接查询,总在用框架进行持久化操作.今天写了一个多表关联查询,想根据两个字段唯一确定一条数据 失败的案例如下: SELECT cyb.id,ad.name FROM [Gen ...

  6. CSS3快速浏览器前缀的方法

    在做前端开发时,经常要在css3的属性前加上各浏览器厂商的前缀:,如 Chrome(谷歌浏览器) :-webkit- Safari(苹果浏览器) :-webkit- Firefox(火狐浏览器) :- ...

  7. JS方面重点摘要(二)

    1.函数声明与函数表达式 (1)变量声明会置顶提前,但赋值仍在原地方(2)函数声明同变量声明一样会提前:但是,函数表达式没有提前,就相当于平时的变量赋值(3)函数声明会覆盖变量声明,但不会覆盖变量赋值 ...

  8. PS如何用制作BMP 256位色非压缩图片,供Easyboot作为背景

    可以先把图片转换为gif格式,然后用Windows自带的画图工具打开,并另存为BMP格式的图片. 但是这样制作完成的图片失真相当严重 再如下面,简直无法不堪入目.   也可以使用PS.准备好图片之后点 ...

  9. Android之短信验证码

    我们今天所使用的方案仅仅是android手机设备集成短信验证码功能的方案之中的一个. 我们所採用的方案是使用聚合数据的短信验证sdk. 程序的界面例如以下所看到的: 实现步骤: 1.到聚合数据官网上申 ...

  10. flask和pymongo的完美搭配

    1.如何进行mongo数据库的链接 import pymongo client = pymongo.MongoClient(host='192.168.*.*', port=27017,) db_au ...