mapreduce应用-找出扣扣共同好友
需求:找出扣扣共同好友
用户:好友,好友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应用-找出扣扣共同好友相关推荐
- MapReduce例子——找出QQ共同好友
///\\\\\\\\ fri.txt 如下: person: friend1, friend2, friend3, friend4, -.. A:B,C,D,F,E,O B:A,C,E,K C:F, ...
- 给了一串数字:218916754,根据下面规则可以找出扣扣号码:首先删除第一个数,紧接着将第二个数放到这串数字的末尾,再将第三个数删除,并将第四个数放到这串数字的末尾......如此循环,知道剩下最后
题:给了一串数字:218916754,根据下面规则可以找出扣扣号码:首先删除第一个数,紧接着将第二个数放到这串数字的末尾,再将第三个数删除,并将第四个数放到这串数字的末尾......如此循环,知道剩下 ...
- hadoop找出QQ共同好友算法实现
背景 A:B,C,D,E,F 表示A有bcdef好友 B:C,D,H,Y 以上可知道AB的共同好友为CD 思路: 1:我们先找出一个人被哪几个人共同拥有 测试数据: 2:第一阶段mr程序: packa ...
- 找出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 ...
- Python脚本一键找出哪些微信好友删了你(附源码)
查看被删的微信好友 原理就是新建群组,如果加不进来就是被删好友了(不要在群组里讲话,别人是看不见的) 用的是微信网页版的接口 查询结果可能会引起一些心理上的不适,请小心使用-(逃 还有些小问题: 结果 ...
- Hadoop MapReduce V2——找出每个月气温最高的2天
项目目录 MyTQ package com.henu.tq; import java.io.IOException; import org.apache.hadoop.conf.Configurati ...
- 31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系?
问题导入 给你一个用户,如何找出这个用户的所有三度(其中包含一度.二度和三度)好友关系? 搜索算法 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于"图" ...
- Python-图-如何找出社交网络中的三度好友关系
羁绊前行的,不是肆虐的狂风,而是内心的迷茫.-王争. 最近有些偷懒,距离上次更新也有两个星期了,原因我也很清楚,就是又开始有些迷茫了,购买了不少课程,仍不能减轻内心的焦虑.焦虑的原因还是想得太多,做得 ...
- python批量删除微信好友_我用Python找出了删除我微信的所有人并将他们自动化删除了...
不知你是否遇到过在微信上给通讯录中的某个人发消息,结果出现了这一幕: 平时一直认为自己的心里素质过硬,不过遇到这种情况 ... 在我缓了半个钟头(半分钟 )之后,缓缓拿出了手机,打开微信,找到通讯录中 ...
最新文章
- 1月23日服务器例行维护更新公告,1月24日服务器例行维护公告(已完成)
- for语句内嵌例题与个人理解
- 内核随记(三)--同步(2)【转】
- ECMAScript5 ES5
- python怎么添加列_如何将列添加到DataFrame列?添加新列详细解释————
- linux fedora35安装kvm虚拟机命令整理
- 分享自己作为一个程序员的找工作经历
- AD灾难恢复情景及方案
- sap权限激活_SAP产品的Field Extensibility
- 如何合理封装你的轮子、飞机、大炮(以封装OkHttp为例)
- ckeditor+ckfinder使用
- 使用paddlepaddle 进行人脸识别
- MDT捕捉镜像提示错误
- 数字图像处理-图像复原
- 面包板电源线怎么接_面包板的结构和使用方法详细介绍
- [4G5G专题-83]:架构 - 移动通信网2G/3G/4G/5G/6G网络架构的演进历程
- xargs -i参数详解
- Oracle从dmp中导入一张表
- 如何获取CSDN积分(下载分)
- matlab 创建批量文件夹_如何在Mac上为照片加水印?水印照片怎样批量处理?
热门文章
- HttpClient实现 get、post、put、delete请求
- JavaScript中split方法的使用
- 详解split()使用方法
- flex与javascript互相通信:使用ExternalInterface
- 【晶体学基础】晶体结构cif文件的查找和获取
- Java中file类getPath(),getAbsolutePath(),getCanonicalPath()方法区别
- Python书单推荐一波
- 玩fifa服务器显示异常,FIFA online3ui错误黑屏黄屏等常见问题解决方法汇总
- Java常用工具_IO流_字节流读写文件
- K8S Runtime CRI OCI contained dockershim 理解 1.23弃用docker - 含docker containerd通用工具 nerdctl