题目如下:

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,K以上是数据:
A:B,C,D,F,E,O
表示:B,C,D,E,F,O是A用户的好友。1、求所有两两用户之间的共同好友

题意理解:求两两的共同好友,例如c是A的好友,C是B的好友,所有AB的共同好友有C。题目陷阱:I的好友包括A,但是A的好友没有I;

解题思路:采用逆向思维,分两步走:要求两两的共同好友,可以先求出以A为共同好友的人的组合,第二步:将组合好的人,两两组合,求出所有的好友。采用组件jobcontrol将两个MapReduce连接起来

代码:

/*** @author: lpj   * @date: 2018年3月16日 下午7:16:47* @Description:*/
package lpj.reduceWork;import java.io.IOException;
import java.util.Arrays;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.jobcontrol.ControlledJob;
import org.apache.hadoop.mapreduce.lib.jobcontrol.JobControl;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/****/
public class SameFriendsMR {public static void main(String[] args) throws Exception {Configuration conf = new Configuration();
//      conf.addResource("hdfs-site.xml");//使用配置文件
//      System.setProperty("HADOOP_USER_NAME", "hadoop");//使用集群///第一步FileSystem fs = FileSystem.get(conf);//默认使用本地Job job = Job.getInstance(conf);job.setJarByClass(SameFriendsMR.class);job.setMapperClass(SameFriendsMR_Mapper.class);job.setReducerClass(SameFriendsMR_Reducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);Path inputPath = new Path("d:/a/homework4.txt");Path outputPath = new Path("d:/a/homework4");if (fs.exists(inputPath)) {fs.delete(outputPath, true);}FileInputFormat.setInputPaths(job, inputPath);FileOutputFormat.setOutputPath(job, outputPath);第二步//FileSystem fs2 = FileSystem.get(conf);//默认使用本地Job job2 = Job.getInstance(conf);job2.setJarByClass(SameFriendsMR.class);job2.setMapperClass(SameFriends2MR_Mapper.class);job2.setReducerClass(SameFriends2MR_Reducer.class);job2.setMapOutputKeyClass(Text.class);job2.setMapOutputValueClass(Text.class);job2.setOutputKeyClass(Text.class);job2.setOutputValueClass(Text.class);Path inputPath2 = new Path("d:/a/homework4");Path outputPath2 = new Path("d:/a/homework4_1");if (fs2.exists(inputPath2)) {fs2.delete(outputPath2, true);}FileInputFormat.setInputPaths(job2, inputPath2);FileOutputFormat.setOutputPath(job2, outputPath2);//采用jobcontrol进行2个MapReduce串行ControlledJob aJob = new ControlledJob(job.getConfiguration());ControlledJob bJob = new ControlledJob(job2.getConfiguration());aJob.setJob(job);bJob.setJob(job2);bJob.addDependingJob(aJob);//指定依赖关系JobControl jc = new JobControl("jcF");jc.addJob(aJob);jc.addJob(bJob);Thread thread = new Thread(jc);thread.start();while(!jc.allFinished()){thread.sleep(1000);}jc.stop();}///第一步/public static class SameFriendsMR_Mapper extends Mapper<LongWritable, Text, Text, Text>{Text kout = new Text();Text valueout = new Text();@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {//A:B,C,D,F,E,OString [] reads = value.toString().trim().split(":");//以用户为value值,好友为key值,求取以某用户为共同好友的人String vv = reads[0];valueout.set(vv);String [] friends = reads[1].split(",");for(int i = 0; i < friends.length; i++){String kk = friends[i];kout.set(kk);context.write(kout, valueout);}}}public static class SameFriendsMR_Reducer extends Reducer<Text, Text, Text, Text>{Text kout = new Text();Text valueout = new Text();@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException {//将用户共同好友的人组合起来StringBuilder sb = new StringBuilder();for(Text text : values){sb.append(text.toString()).append(",");}String vv = sb.substring(0, sb.length() - 1);valueout.set(vv);context.write(key, valueout);}}//第二步///public static class SameFriends2MR_Mapper extends Mapper<LongWritable, Text, Text, Text>{Text kout = new Text();Text valueout = new Text();@Overrideprotected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {//A F,I,O,K,G,D,C,H,B :意思是F,I,O,K,G,D,C,H,B的共同好友为A,第二步执行求取两两好友,A为value,两两对为keyString [] reads = value.toString().trim().split("\t");//A为valueString vv = reads[0];valueout.set(vv);//求两两好友对,为了防止重复,需要对好友进行排序String [] friends = reads[1].split(",");Arrays.sort(friends);//使用两重循环,寻找A-B等好友对组合for(int i = 0; i < friends.length - 1; i++){for(int j = i + 1; j < friends.length; j++ ){String kk = friends[i] + "-" + friends[j];kout.set(kk);context.write(kout, valueout);}}}}public static class SameFriends2MR_Reducer extends Reducer<Text, Text, Text, Text>{Text kout = new Text();Text valueout = new Text();@Overrideprotected void reduce(Text key, Iterable<Text> values, Context context)throws IOException, InterruptedException {//好友对组合起来StringBuilder sb = new StringBuilder();for(Text text : values){sb.append(text.toString()).append(",");}String vv = sb.substring(0, sb.length() - 1);valueout.set(vv);context.write(key, valueout);}}
}

第一步运行结果:

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

第二步运行结果:共74行

A-B  E,C
A-C D,F
A-D E,F
A-E B,C,D
A-F C,E,O,D,B
A-G E,F,C,D
A-H C,D,E,O
A-I O
A-J O,B
A-K C,D
A-L F,D,E
A-M F,E
B-C A
B-D A,E
B-E C
B-F C,A,E
B-G E,C,A
B-H E,C,A
B-I A
B-K A,C
B-L E
B-M E
B-O A,K
C-D A,F
C-E D
C-F A,D
C-G A,D,F
C-H D,A
C-I A
C-K A,D
C-L D,F
C-M F
C-O I,A
D-E L
D-F A,E
D-G E,A,F
D-H A,E
D-I A
D-K A
D-L E,F
D-M F,E
D-O A
E-F D,M,C,B
E-G C,D
E-H C,D
E-J B
E-K C,D
E-L D
F-G D,C,A,E
F-H A,D,O,E,C
F-I O,A
F-J B,O
F-K D,C,A
F-L E,D
F-M E
F-O A
G-H D,C,E,A
G-I A
G-K D,A,C
G-L D,F,E
G-M E,F
G-O A
H-I O,A
H-J O
H-K A,C,D
H-L D,E
H-M E
H-O A
I-J O
I-K A
I-O A
K-L D
K-O A
L-M E,F

MapReduce案例4——求两两共同好友相关推荐

  1. MapReduce案例5——求互粉好友对

    题目: 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 ...

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

  3. Hadoop/MapReduce 共同好友解决方案:求大量集合的两两交集

    共同好友:求大量集合的两两交集 目标:令U为包含所有用户的一个集合:{U1,U2,...,Un},我们的目标是为每个(Ui,Uj)对(i!=j)找出共同好友. 前提:好友关系是双向的输入:<pe ...

  4. 文件夹中是微信的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的),参照笔记,求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?

    题目 文件夹中是微信的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的),参照笔记,求出哪些人两两之间有共同好友,及他俩的共同好友都有谁? 本题声明: 1.采用Lin ...

  5. Java编程语言学习:Java语言基础案例(如求两门课分数之差、三门课平均分、关系运算符作比较)之详细攻略

    Java编程语言学习:Java语言基础案例(如求两门课分数之差.三门课平均分.关系运算符作比较)之详细攻略 目录 Java语言基础案例 1.求两门课分数之差.三门课平均分: 2.关系运算符作比较

  6. hive sql趣味题-求两两的共同好友

    初始条件 给出以下两列,分别为用户和用户的好友列表,要求求两两的共同好友. user friend_list a b,c,d b c,d,e c a,f d a,e 建表 CREATE TABLE ` ...

  7. hadoop入门6:hadoop查询两两之间有共同好友,及他俩的共同好友都是谁

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

  8. MapReduce实战之找博客共同好友案例

    1)需求: 以下是博客的好友列表数据,冒号前是一个用户,冒号后是该用户的所有好友(数据中的好友关系是单向的) 输入数据 A:B,C,D,F,E,O B:A,C,E,K C:F,A,D,I D:A,E, ...

  9. 需求案例:求共同好友

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

最新文章

  1. 创建UITextField对象
  2. [总结篇1]openstack neutron 中是如何做到二层隔离的
  3. Python入门100题 | 第026题
  4. LeetCode【13--罗马数字转整数】LeetCode【14--最长的公共前缀】
  5. 实战之十一 windows 2008 r2 AD 备份和还原(上)-非授权还原
  6. Shell命令-系统信息及显示之dmesg、uptime
  7. JavaScript中DOM的层次节点(一)
  8. 基于JAVA+Spring+MYSQL的公共自行车管理系统
  9. 蓝桥杯51单片机之数码管从点亮到动态时钟的实现【单片机开发初学者必掌握】
  10. eq相等 ne、neq不相等 EL表达式
  11. 嵌入式linux 中文输入法,基于嵌入式Linux的汉字输入法
  12. setw和width
  13. 路由器ipv4和ipv6转发原理
  14. 分组数据方差公式_用Excel算分组方差《excel怎么求分组的数据的标准差》
  15. 收藏!常用的档案馆(室)检索工具及编制方法
  16. word目录制表符对齐
  17. 企业wifi统一认证怎样呀
  18. 10年资深架构师推荐21本技术好书
  19. STM32------ADC(电压检测)
  20. 依巴谷星表中的毕星团认证杯B题

热门文章

  1. python--re模块--黑科技
  2. 松勤性能测试项目实战(监控+分析+调优)集训营学习笔记
  3. CCNU ACM 2016夏季集训·day3比赛
  4. Android11.0(R) 预留清空锁屏密码接口
  5. 我的LaTeX开发环境配置
  6. 【HarmonyOS应用开发】Hello HarmonyOS到Hi HarmonyOS(1)
  7. Linux智能手表的浪潮即将向我们袭来
  8. 学术论文中通讯作者与第一作者有什么区别?
  9. origin是曲线图层在坐标轴上面
  10. 乐观锁和悲观锁的区别