MapReduce 사례 - 친구 추천

5923 단어 mapreduce
각종 소 셜 네트워크 서비스 (예 를 들 어 QQ, 웨 이 보, 친구 망 등) 를 사용 한 어린이 들 은 '알 수 있 습 니 다' 또는 '친구 추천' 이라는 기능 이 있다 는 것 을 알 고 있 을 것 입 니 다 (아래 그림).그것 의 알고리즘 은 주로 당신들 간 의 공 통 된 친구 수 에 따라 추천 하 는 것 입 니 다. 물론 취미, 특기 등 도 있 습 니 다.공동 친구 의 수가 많 을 수록 당신들 이 알 수 있 음 을 나타 내 고 시스템 은 자동 으로 추천 할 것 입 니 다.오늘 은 MapReduce 를 어떻게 사용 하여 공동 친 구 를 계산 하 는 지 소개 하 겠 습 니 다.
알고리즘
         ,A    B,C,D,F,E,O;   B    A,C,E,K     
        A-O              ?
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,D,E      。  B,C,D,E     (B-C    A,      B-C,C-B)  key   reduce ,
  reduce      B-C        。               ,          。

코드 데모
위 에서 알 수 있 듯 이 이번 계산 은 두 단계 로 구성 되 기 때문에 두 개의 MapReduce 절차 가 연이어 집행 되 어야 한다.
   :  mapreduce                 。
public class FriendsDemoStepOneDriver {

    static class FriendsDemoStepOneMapper extends Mapper {
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            String line = value.toString();

            String[] split = line.split(":");
            String user = split[0];
            String[] friends = split[1].split(",");

            for (String friend : friends) {
//                    , 。                     
                context.write(new Text(friend),new Text(user));
            }
        }
    }

    static class FriendsDemoStepOneReducer extends Reducer{

        @Override
        protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
            StringBuilder sb = new StringBuilder();
            for (Text person : values) {
                sb.append(person+",");
            }

            context.write(key,new Text(sb.toString()));
        }
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        conf.set("mapreduce.framework.name","local");
        conf.set("fs.defaultFS","file:///");

        Job job = Job.getInstance(conf);

        job.setJarByClass(FriendsDemoStepOneDriver.class);

        job.setMapperClass(FriendsDemoStepOneMapper.class);
        job.setReducerClass(FriendsDemoStepOneReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        FileInputFormat.setInputPaths(job,new Path("/Users/kris/Downloads/mapreduce/friends/friends.txt"));
        FileOutputFormat.setOutputPath(job,new Path("/Users/kris/Downloads/mapreduce/friends/output"));

        boolean completion = job.waitForCompletion(true);
        System.out.println(completion);
    }

}

그림 에서 볼 수 있 듯 이 I, K, C, B, G, F, H, O, D 는 모두 친구 A 가 있다.A, F, J, E 는 모두 친구 B 가 있다.다음은 같은 친 구 를 가 진 사용자 들 을 조합 하면 됩 니 다.
key 로 reduce 에 보 내 고 reduce 단 에서 d 를 취 합 하여 모든 공 통 된 친 구 를 얻 습 니 다.
/**
 *                  ,         
 */
public class FriendsDemoStepTwoDriver {

    static class FriendDemoStepTwoMapper extends Mapper {

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {

            String line = value.toString();

            String[] split = line.split("\t");
            String friend = split[0];
            String[] persons = split[1].split(",");

            Arrays.sort(persons);

            for (int i = 0; i < persons.length-1; i++) {
                for (int i1 = i+1; i1 < persons.length; i1++) {
                    context.write(new Text(persons[i]+"--"+persons[i1]),new Text(friend));
                }
            }

        }
    }

    static class FriendDemoStepTwoReducer extends Reducer {

        @Override
        protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
            StringBuilder sb = new StringBuilder();

            for (Text friend : values) {
                sb.append(friend + ",");
            }

            context.write(key,new Text(sb.toString()));
        }
    }


    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        Configuration conf = new Configuration();
        conf.set("mapreduce.framework.name","local");
        conf.set("fs.defaultFS","file:///");

        Job job = Job.getInstance(conf);

        job.setJarByClass(FriendsDemoStepOneDriver.class);

        job.setMapperClass(FriendDemoStepTwoMapper.class);
        job.setReducerClass(FriendDemoStepTwoReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        FileInputFormat.setInputPaths(job,new Path("/Users/kris/Downloads/mapreduce/friends/output"));
        FileOutputFormat.setOutputPath(job,new Path("/Users/kris/Downloads/mapreduce/friends/output2"));

        boolean completion = job.waitForCompletion(true);
        System.out.println(completion);
    }
}
       :

그림 에서 우 리 는 공 통 된 친 구 를 가 진 사용자 목록 과 해당 하 는 관 계 를 얻 었 다. 실제 장면 에서 사용자 관계 (예 를 들 어 친구 가 되 었 는 지) 에 따라 필 터 를 하고 전단 에 보 여주 면 우리 가 본 '알 수 있 는' 또는 '친구 추천' 이 형성 된다.
                  ,            ,                  ,
           ,           ,          ~

             like,share,comment (^^)

본 고 는 블 로그 한 글 다발 플랫폼 OpenWrite 에서 발표 합 니 다!

좋은 웹페이지 즐겨찾기