需求:找出扣扣共同好友
用户:好友,好友2,…
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

思路:先找出哪个好友是哪些用户的好友,比如B是A,E,F,J的共同好友B–>A,E,F,J
写成

<A-E,B><A-f,B><A-J,B>...<用户1-用户2,好友B>

接着传到reduce中为

<用户1-用户2,好友迭代器>
输出成<用户1-用户2,好友1,好友2,好友3...>

程序实现:第一步

public class QQFriendsFindStepOne {static class QQFriendsFindStepOneMapper extends Mapper<LongWritable, Text, Text, Text>{@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {//读取一行数据  A:B,C,D,F,E,O 用户:好友们String values= value.toString();//获取用户和好友String[] user_friends = values.split(":");String user = user_friends[0];String[] friends = user_friends[1].split(",");//输出<好友,用户>for (String friend : friends) {context.write(new Text(friend), new Text(user));}}}static class QQFriendsFindStepOneReducer extends Reducer<Text, Text, Text, Text>{//进入的是<好友,拥有该好友的用户的迭代器>@Overrideprotected void reduce(Text friend, Iterable<Text> users, Context context)throws IOException, InterruptedException {StringBuffer sb = new StringBuffer();for (Text user : users) {sb.append(user.toString()+",");}//输出<好友,用户1,用户2,...,用户n,><A       C,B,D,F,E,O,>context.write(friend, new Text(sb.toString()));}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf);//jar包位置job.setJarByClass(QQFriendsFindStepOne.class);job.setMapperClass(QQFriendsFindStepOneMapper.class);job.setReducerClass(QQFriendsFindStepOneReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//设置最终输出类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));boolean ex = job.waitForCompletion(true);System.exit(ex?0:1); }
}

测试第一步输出:
将工程打包上传到hadoop集群
hdfs创建文件夹/friends/input
linux编辑文件friends.data,写入好友用户数据
将本地文件上传到/friends/input
运行程序查看输出结果

[root@mini1 ~]# hadoop fs -mkdir -p /friends/input
[root@mini1 ~]# vi friends.data
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
[root@mini1 ~]# hadoop fs -put friends.data /friends/input
[root@mini1 ~]# hadoop jar friends.jar com.scu.hadoop.sharefriends.QQFriendsFindStepOne  /friends/input /friends/output
[root@mini1 ~]# hadoop fs -cat /friends/input/part-r-00000
Java HotSpot(TM) Client VM warning: You have loaded library /root/apps/hadoop-2.6.4/lib/native/libhadoop.so.1.0.0 which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
cat: `/friends/input/part-r-00000': No such file or directory
[root@mini1 ~]# hadoop fs -cat /friends/output/part-r-00000
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,

程序实现:第二步

public class QQFriendsFindStepTwo {static class QQFriendsFindStepTwoMapper extends Mapper<LongWritable, Text, Text, Text>{//传入数据为第一个程序输出文件的内容//<好友,用户1,用户2,...,用户n,><A       C,B,D,F,E,O,>@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {String line = value.toString();//切割,获得用户和好友String[] friend_users = line.split("\t");String friend = friend_users[0];String[] users = friend_users[1].split(",");//一定要排序,否则可能出现重复的情况,比如<A-B,好友>和<B-A,好友>应该是一样的//不排序就做为了不同的key传给了reduceArrays.sort(users);StringBuffer sb = new StringBuffer();//输出<用户a-用户b,好友>for(int i=0;i<users.length-2;i++){for(int j=i+1;j<users.length-1;j++){context.write(new Text(users[i]+"-"+users[j]), new Text(friend));}}}}static class QQFriendsFindStepTwoReducer extends Reducer<Text, Text, Text, Text>{//传入的数据<用户a-用户b,好友迭代器>@Overrideprotected void reduce(Text userTuser, Iterable<Text> friends, Context context)throws IOException, InterruptedException {StringBuffer sb = new StringBuffer();for (Text friend : friends) {sb.append(friend+",");}//写出数据格式<用户1-用户2,好友列表><A-B,C,D,E...>context.write(userTuser, new Text(sb.toString()));}}public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf);//jar包位置job.setJarByClass(QQFriendsFindStepTwo.class);job.setMapperClass(QQFriendsFindStepTwoMapper.class);job.setReducerClass(QQFriendsFindStepTwoReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//设置最终输出类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));boolean ex = job.waitForCompletion(true);System.exit(ex?0:1); }
}

第二步测试:
重新将工程打包上传到hadoop集群
将第一步的输出文件作为该步的输入文件

[root@mini1 ~]# hadoop jar friends.jar com.scu.hadoop.sharefriends.QQFriendsFindStepTwo  /friends/output/part-r-00000 /friends/output2
[root@mini1 ~]# hadoop fs -cat /friends/output2/part-r-00000
A-B     C,E,
A-C     F,D,
A-D     E,F,
A-E     B,C,D,
A-F     C,D,B,E,O,
A-G     D,E,F,C,
A-H     E,O,C,D,
A-I     O,
A-K     D,
A-L     F,E,
B-C     A,
B-D     E,A,
B-E     C,
B-F     E,A,C,
B-G     C,E,A,
B-H     E,C,A,
B-I     A,
B-K     A,
B-L     E,
C-D     F,A,
C-E     D,
C-F     D,A,
C-G     F,A,D,
C-H     A,D,
C-I     A,
C-K     D,A,
C-L     F,
D-F     E,A,
D-G     A,E,F,
D-H     A,E,
D-I     A,
D-K     A,
D-L     F,E,
E-F     C,D,B,
E-G     D,C,
E-H     D,C,
E-K     D,
F-G     C,E,D,A,
F-H     C,A,D,E,O,
F-I     A,O,
F-K     D,A,
F-L     E,
G-H     D,E,C,A,
G-I     A,
G-K     A,D,
G-L     F,E,
H-I     A,O,
H-K     A,D,
H-L     E,
I-K     A,

mapreduce应用-找出扣扣共同好友相关推荐

  1. MapReduce例子——找出QQ共同好友

    ///\\\\\\\\ fri.txt 如下: person: friend1, friend2, friend3, friend4, -.. A:B,C,D,F,E,O B:A,C,E,K C:F, ...

  2. 给了一串数字:218916754,根据下面规则可以找出扣扣号码:首先删除第一个数,紧接着将第二个数放到这串数字的末尾,再将第三个数删除,并将第四个数放到这串数字的末尾......如此循环,知道剩下最后

    题:给了一串数字:218916754,根据下面规则可以找出扣扣号码:首先删除第一个数,紧接着将第二个数放到这串数字的末尾,再将第三个数删除,并将第四个数放到这串数字的末尾......如此循环,知道剩下 ...

  3. hadoop找出QQ共同好友算法实现

    背景 A:B,C,D,E,F 表示A有bcdef好友 B:C,D,H,Y 以上可知道AB的共同好友为CD 思路: 1:我们先找出一个人被哪几个人共同拥有 测试数据: 2:第一阶段mr程序: packa ...

  4. 找出QQ共同好友的实现

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

  5. Python脚本一键找出哪些微信好友删了你(附源码)

    查看被删的微信好友 原理就是新建群组,如果加不进来就是被删好友了(不要在群组里讲话,别人是看不见的) 用的是微信网页版的接口 查询结果可能会引起一些心理上的不适,请小心使用-(逃 还有些小问题: 结果 ...

  6. Hadoop MapReduce V2——找出每个月气温最高的2天

    项目目录 MyTQ package com.henu.tq; import java.io.IOException; import org.apache.hadoop.conf.Configurati ...

  7. 31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?

    问题导入 给你一个用户,如何找出这个用户的所有三度(其中包含一度.二度和三度)好友关系? 搜索算法 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于"图" ...

  8. Python-图-如何找出社交网络中的三度好友关系

    羁绊前行的,不是肆虐的狂风,而是内心的迷茫.-王争. 最近有些偷懒,距离上次更新也有两个星期了,原因我也很清楚,就是又开始有些迷茫了,购买了不少课程,仍不能减轻内心的焦虑.焦虑的原因还是想得太多,做得 ...

  9. python批量删除微信好友_我用Python找出了删除我微信的所有人并将他们自动化删除了...

    不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟 )之后,缓缓拿出了手机,打开微信,找到通讯录中 ...

最新文章

  1. 1月23日服务器例行维护更新公告,1月24日服务器例行维护公告(已完成)
  2. for语句内嵌例题与个人理解
  3. 内核随记(三)--同步(2)【转】
  4. ECMAScript5 ES5
  5. python怎么添加列_如何将列添加到DataFrame列?添加新列详细解释————
  6. linux fedora35安装kvm虚拟机命令整理
  7. 分享自己作为一个程序员的找工作经历
  8. AD灾难恢复情景及方案
  9. sap权限激活_SAP产品的Field Extensibility
  10. 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)
  11. ckeditor+ckfinder使用
  12. 使用paddlepaddle 进行人脸识别
  13. MDT捕捉镜像提示错误
  14. 数字图像处理-图像复原
  15. 面包板电源线怎么接_面包板的结构和使用方法详细介绍
  16. [4G5G专题-83]:架构 - 移动通信网2G/3G/4G/5G/6G网络架构的演进历程
  17. xargs -i参数详解
  18. Oracle从dmp中导入一张表
  19. 如何获取CSDN积分(下载分)
  20. matlab 创建批量文件夹_如何在Mac上为照片加水印?水印照片怎样批量处理?

热门文章

  1. HttpClient实现 get、post、put、delete请求
  2. JavaScript中split方法的使用
  3. 详解split()使用方法
  4. flex与javascript互相通信:使用ExternalInterface
  5. 【晶体学基础】晶体结构cif文件的查找和获取
  6. Java中file类getPath(),getAbsolutePath(),getCanonicalPath()方法区别
  7. Python书单推荐一波
  8. 玩fifa服务器显示异常,FIFA online3ui错误黑屏黄屏等常见问题解决方法汇总
  9. Java常用工具_IO流_字节流读写文件
  10. K8S Runtime CRI OCI contained dockershim 理解 1.23弃用docker - 含docker containerd通用工具 nerdctl