MapReduce小案例——找朋友

MapReduce小案例——找朋友

需求:在朋友圈内有一票人,他们之间加了微信好友,现在我们需要找出他们两两共同的好友?

在这里插入图片描述

有上图可知,输入数据,他们所拥有的好友为:friend1.txt

A:B,D,F,I,J,O
B:A,C,E,G,K,P
C:B,D,F,H,R
D:A,C,E,H,L,S
E:B,D,H,M
F:A,C,I,J
G:B,K,N,O
H:C,D,E,M
I:A,F,J,L,Q
J:A,F,I,N,S
K:B,G,L,P,R
L:D,I,K,P,Q
M:E,H,O,S
N:G,J,Q,R,
O:A,G,M,P,R
P:B,K,O,Q,S
Q:I,L,N,P,R,S
R:C,K,N,O,Q
S:D,J,M,N,P,Q

可能出现的情况:

1.他们之间关系都维持地非常的好,没有人被拉黑,或者删除。

2.他们之间相处可能不是那么的融洽,有人被单方拉黑或删除了。

第一种情况的解决方案:

思路:仅需一次MapReduce:

1.Map阶段每行中主人被单独切分,则后面的好友两两进行排列组合,这可以得出主人便是好友对中两人的共同好友,好友对作为key,主人作为值输出到reduce中。

2.Reduce阶段,对输入value的共同好友进行拼接,便可以的两人的共同好友。

package com.nike.hadoop.mapred.friend01;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;


public class FriendMap extends Mapper<LongWritable, Text, Text, Text> {
   
    private Text keyOut = new Text();
    private Text valOut = new Text();

    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
   
        String[] split = value.toString().split(":");
        String[] friends = split[1].split(",");
        for (int i = 0; i < friends.length-1; i++) {
   
            for (int j = i+1; j < friends.length; j++) {
   
                if ((friends[i].compareTo(friends[j])>0)){
   
                    String out = friends[j]+"-"+friends[i];
                    keyOut.set(out);
                    valOut.set(split[0]);
                    context.write(keyOut,valOut);
                }else{
   
                    String out = friends[i]+"-"+friends[j];
                    keyOut.set(out);
                    valOut.set(split[0]);
                    context.write(keyOut,valOut);
                }
            }
        }
    }
}
package com.nike.hadoop.mapred.friend01;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.Iterator;

public class FriendReduce extends Reducer<Text,Text,Text, Text> {
   
    private Text valOut = new Text();
    @Override
    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
   
        StringBuilder sb = new StringBuilder();
        Iterator<Text> iterator = values.iterator();
        while(iterator.hasNext()){
   
            String friend = iterator.next().toString();
            sb.append("\t"+friend);
        }
        valOut.set(sb.toString());
        context.write(key,valOut);
    }
}
package com.nike.hadoop.mapred.friend01;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值