MapReduce 사례 - 친구 추천
5923 단어 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 에서 발표 합 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MongoDB mapreduce 인스턴스var action_count_map = function(){ var action_count_reduce = function(key, values){ db.log.mapReduce(action_count_map, a...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.