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: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
求出哪些人两两之间有共同好友,及他俩的共同好友都有谁?
解题思路:
- 第一步
- map
- 读一行 A:B,C,D,F,E,O
- 输出 <B,A><C,A><D,A><F,A><E,A><O,A>
- 在读一行 B:A,C,E,K
- 输出 <A,B><C,B><E,B><K,B>
- REDUCE
- 拿到的数据比如<C,A><C,B><C,E><C,F><C,G>......
- 输出:
- <A-B,C>
- <A-E,C>
- <A-F,C>
- <A-G,C>
- <B-E,C>
- <B-F,C>.....
- 第二步
- map
- 读入一行<A-B,C>
- 直接输出<A-B,C>
- reduce
- 读入数据 <A-B,C><A-B,F><A-B,G>.......
- 输出: A-B C,F,G,.....
第一步:代码实现
- public class ComonsFriendsStepOne extends Configured implements Tool {
- @Override
- public int run(String[] args) throws Exception {
- Configuration conf = super.getConf();
- Job job = Job.getInstance(conf, ComonsFriendsStepOne.class.getSimpleName());
- job.setInputFormatClass(TextInputFormat.class);
- TextInputFormat.addInputPath(job,new Path("file:///F:\\\input"));
- job.setMapperClass(ComonsFriendsStepOneMapper.class);
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(Text.class);
- job.setReducerClass(ComonsFriendsStepOneReducer.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(Text.class);
- job.setOutputFormatClass(TextOutputFormat.class);
- TextOutputFormat.setOutputPath(job,new Path("file:///F:\\output"));
- boolean b = job.waitForCompletion(true);
- return b?0:1;
- }
- public static class ComonsFriendsStepOneMapper extends Mapper<LongWritable,Text,Text,Text>{
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- String[] split = value.toString().split(":");
- String person = split[0];
- String[] friends = split[1].split(",");
- for (String friend : friends) {
- context.write(new Text(friend),new Text(person));
- }
- }
- }
- public static class ComonsFriendsStepOneReducer extends Reducer<Text,Text,Text,Text>{
- @Override
- protected void reduce(Text friend, Iterable<Text> persons, Context context) throws IOException, InterruptedException {
- StringBuffer buffer = new StringBuffer();
- for (Text person : persons) {
- buffer.append(person).append("-");
- }
- context.write(friend,new Text(buffer.toString()));
- }
- }
- public static void main(String[] args) throws Exception {
- Configuration configuration = new Configuration();
- ToolRunner.run(configuration,new ComonsFriendsStepOne(),args);
- }
- }
第二步:代码实现
- public class ComonsFriendsStepTwo extends Configured implements Tool {
- @Override
- public int run(String[] args) throws Exception {
- Job job = Job.getInstance(super.getConf(), ComonsFriendsStepTwo.class.getSimpleName());
- job.setInputFormatClass(TextInputFormat.class);
- TextInputFormat.addInputPath(job,new Path("file:///F:\\output"));
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(Text.class);
- job.setMapperClass(ComonsFriendStepTwoMapper.class);
- job.setReducerClass(ComonsFriendStepTwoReducer.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(Text.class);
- job.setOutputFormatClass(TextOutputFormat.class);
- TextOutputFormat.setOutputPath(job,new Path("file:///F:\\outstep2"));
- boolean b = job.waitForCompletion(true);
- return b?0:1;
- }
- public static class ComonsFriendStepTwoMapper extends Mapper<LongWritable,Text,Text,Text>{
- /**
- * A F-D-O-I-H-B-K-G-C-
- * B E-A-J-F-
- * C K-A-B-E-F-G-H-
- */
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- String[] split = value.toString().split("\t");
- String friends = split[0];
- String[] persons = split[1].split("-");
- //排序,避免c-b 与b-c 这样的情况出现
- Arrays.sort(persons);
- for(int i =0;i< persons.length -1 ;i++){
- for(int j = i+1;j<persons.length;j++){
- context.write(new Text(persons[i]+"-"+persons[j]),new Text(friends));
- }
- }
- }
- }
- public static class ComonsFriendStepTwoReducer extends Reducer<Text,Text,Text,Text>{
- @Override
- protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
- StringBuffer buffer = new StringBuffer();
- for (Text value : values) {
- buffer.append(value.toString()+"\t");
- }
- context.write(key,new Text(buffer.toString()));
- }
- }
- public static void main(String[] args) throws Exception {
- ToolRunner.run(new Configuration(),new ComonsFriendsStepTwo(),args);
- }
- }
扩展:求互粉的人。
mapreduce求共同好友的更多相关文章
- 用Mapreduce求共同好友
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...
- Hadoop阅读笔记(二)——利用MapReduce求平均数和去重
前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...
- 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求气温值项目
Mapreduce前提工作 简单的来说map是大数据,reduce是计算<运行时如果数据量不大,但是却要分工做这就比较花时间了> 首先想要使用mapreduce,需要在linux中进行一些 ...
- Hadoop学习之路(二十)MapReduce求TopN
前言 在Hadoop中,排序是MapReduce的灵魂,MapTask和ReduceTask均会对数据按Key排序,这个操作是MR框架的默认行为,不管你的业务逻辑上是否需要这一操作. 技术点 MapR ...
- Hadoop 学习笔记 (十一) MapReduce 求平均成绩
china:张三 78李四 89王五 96赵六 67english张三 80李四 82王五 84赵六 86math张三 88李四 99王五 66赵六 77 import java.io.IOEx ...
- 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 ...
- MapReduce求最大值最小值问题
import java.io.File; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import ...
- mapreduce求平均数
1. 现有某电商关于商品点击情况的数据文件,表名为goods_click,包含两个字段(商品分类,商品点击次数),分隔符“ ”,由于数据很大,所以为了方便统计我们只截取它的一部分数据,内容如下 ...
随机推荐
- JS谷歌浏览器断点调试
1.找到对应的文件 按F12打开网页调试工具,默认打开的是Elements,显示的是网页标签元素.选择Source,在左侧找到对应的js代码文件(这里是在page标签上找到的) 1.1.如何找到web ...
- 深入理解js——非构造函数的继承
原文来自阮一峰日志(http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.ht ...
- python中chr()函数和ord()函数的用法
一,chr()函数 格式:Chr(<数值表达式>) 说明:函数返回值类型为String,其数值表达式值取值范围为0~255. 例如:Print Chr(78),结果显示:N. ...
- 小程序 css 文字溢出,长度过长用 。。。
word-break: break-all;/*允许在单词内换行*/ text-align: left; /* line-height: 45rpx; */ text-overflow: -o-ell ...
- selenium2-java 浏览器cookie的获取
//成功登陆后增加如下代码 File cookieFile = new File("C:\\tmp\\tangdai.cookie.txt"); ...
- jenkins-参数化构建插件:Choice Parameter
参考: 谢谢大佬的总结: https://www.cnblogs.com/zhaojingyu/p/9862371.html 使用方式 step1: 添加参数,选择Choice Parameter,并 ...
- PAT_A1073#Scientific Notation
Source: PAT A1073 Scientific Notation (20 分) Description: Scientific notation is the way that scient ...
- JQuery获取与设置select
获取select : 1.获取select 选中的 text : $("#ddlregtype").find("option:selected").tex ...
- leetcode.分治.241为运算表达式设计优先级-Java
1. 具体题目 给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果.你需要给出所有可能的组合的结果.有效的运算符号包含 +, - 以及 * . 示例 1: 输入: & ...
- 44-python基础-python3-字符串-常用字符串方法(二)-isalpha()-isalnum()-isdigit()-isspace()-istitle()
3-isX 字符串方法 序号 方法 条件 返回结果1 返回结果2 1 isalpha() 如果字符串只包含字母,并且非空; True False 2 isalnum() 如果字符串只包含字母和数字 ...