首页 > 代码库 > MapReduce实战(六)

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,O
J:B,O
K:A,C,D
L:D,E,F
M:E,F,G
O:A,H,I,J

求出哪些人两两之间有共同好友,及他俩的共同好友都是谁。
比如:
A,B:[C,E]

分析:

在利用MapReduce程序解答之前,我们不妨用单机程序练习一下,思路很简单,可以利用两个for循环进行遍历,分别找之间的共同好友,如果有则存到list中,设一个map,key就是两个人的ID,value就是存的list,最后就能求得两个人之间的共同好友。程序如下:

package com.darrenchan.test;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws Exception {
        FileInputStream fis = new FileInputStream(new File("data.txt"));
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);
        String line = null;

        // 将文件中的内容存到list中
        List<String> list = new ArrayList<String>();
        while ((line = br.readLine()) != null) {
            list.add(line);
        }

        Map<String, List<String>> map = new LinkedHashMap<>();
        // 对list进行处理
        for (int i = 0; i < list.size(); i++) {
            for (int j = i + 1; j < list.size(); j++) {
                //临时的list,用于拼接最后结果中的共同好友
                List<String> tempList = new ArrayList<>();
                //按照":"进行分割
                String keyi = list.get(i).split(":")[0];
                String keyj = list.get(j).split(":")[0];
                String contenti = list.get(i).split(":")[1];
                String contentj = list.get(j).split(":")[1];

                //让i层的每一个好友分别和j层的好友找共同好友
                String[] fields = contenti.split(",");
                for (int k = 0; k < fields.length; k++) {
                    if (contentj.contains(fields[k])) {
                        tempList.add(fields[k]);
                    }
                }
                
                // 如果tempList里面有内容说明就是有相同元素
                if (tempList.size() > 0) {
                    map.put(keyi + "," + keyj, tempList);
                }
            }
        }

        // 打印map
        for (String key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
    }
}

求得结果:

A,B:[C, E]
A,C:[D, F]
A,D:[F, E]
A,E:[B, C, D]
A,F:[B, C, D, E, O]
A,G:[C, D, F, E]
A,H:[C, D, E, O]
A,I:[O]
A,J:[B, O]
A,K:[C, D]
A,L:[D, F, E]
A,M:[F, E]
B,C:[A]
B,D:[A, E]
B,E:[C]
B,F:[A, C, E]
B,G:[A, C, E]
B,H:[A, C, E]
B,I:[A]
B,K:[A, C]
B,L:[E]
B,M:[E]
B,O:[A]
C,D:[F, A]
C,E:[D]
C,F:[A, D]
C,G:[F, A, D]
C,H:[A, D]
C,I:[A]
C,K:[A, D]
C,L:[F, D]
C,M:[F]
C,O:[A, I]
D,E:[L]
D,F:[A, E]
D,G:[A, E, F]
D,H:[A, E]
D,I:[A]
D,K:[A]
D,L:[E, F]
D,M:[E, F]
D,O:[A]
E,F:[B, C, D, M]
E,G:[C, D]
E,H:[C, D]
E,J:[B]
E,K:[C, D]
E,L:[D]
F,G:[A, C, D, E]
F,H:[A, C, D, E, O]
F,I:[A, O]
F,J:[B, O]
F,K:[A, C, D]
F,L:[D, E]
F,M:[E]
F,O:[A]
G,H:[A, C, D, E]
G,I:[A]
G,K:[A, C, D]
G,L:[D, E, F]
G,M:[E, F]
G,O:[A]
H,I:[A, O]
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的程序进行求解呢?

 

MapReduce实战(六)