当前位置: 代码迷 >> 综合 >> mapreduce程序案例4
  详细解决方案

mapreduce程序案例4

热度:24   发布时间:2024-02-27 10:14:05.0

需求:

查找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

思路:

找出key为B,C,D,F,E,O的共同好友为A,然后reduce,去重,获取所有QQ的共同好友列表;

package application.mapreduce;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.hadoop.io.WritableComparable;import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;/*** @author: wtl* @License: (C) Copyright 2020, wtl Corporation Limited.* @Contact: 1050100468@qq.com* @Date: 2020-10-11 18:16* @Version: 1.0* @Description:*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Friend implements WritableComparable<Friend> {private String friend;@Overridepublic int compareTo(Friend o) {String[] fs = friend.split("_");String[] f2s = o.friend.split("_");Set<String> fSet = new TreeSet<>(Arrays.asList(fs));Set<String> f2Set = new TreeSet<>(Arrays.asList(f2s));StringBuilder stringBuilderF1 = new StringBuilder();StringBuilder stringBuilderF2 = new StringBuilder();fSet.forEach(stringBuilderF1::append);f2Set.forEach(stringBuilderF2::append);return stringBuilderF1.toString().compareTo(stringBuilderF2.toString());}@Overridepublic void write(DataOutput dataOutput) throws IOException {dataOutput.writeUTF(friend);}@Overridepublic void readFields(DataInput dataInput) throws IOException {friend = dataInput.readUTF();}
}
package application.mapreduce;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** @author: wtl* @License: (C) Copyright 2020, wtl Corporation Limited.* @Contact: 1050100468@qq.com* @Date: 2020-10-11 18:15* @Version: 1.0* @Description:*/
public class FriendsMapper extends Mapper<LongWritable, Text,Friend,Text> {private Text text = new Text();@Overrideprotected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String line = value.toString();String[] fields = line.split(":");String friend = fields[0];String[] persons = fields[1].split(",");text.set(friend);for (int i = 0; i < persons.length; i++) {for (int j=i+1;j< persons.length;j++){Friend build = Friend.builder().friend(persons[i] + "_" + persons[j]).build();context.write(build,text);}}}
}
package application.mapreduce;import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.Set;
import java.util.TreeSet;/*** @author: wtl* @License: (C) Copyright 2020, wtl Corporation Limited.* @Contact: 1050100468@qq.com* @Date: 2020-10-11 18:36* @Version: 1.0* @Description:*/
public class FriendsReducer extends Reducer<Friend, Text,Friend,Text> {private Text text = new Text();@Overrideprotected void reduce(Friend key, Iterable<Text> values, Context context) throws IOException, InterruptedException {Set<String> set = new TreeSet<>();for (Text value : values){set.add(value.toString());}StringBuilder stringBuilder = new StringBuilder();set.forEach(s -> {stringBuilder.append(s).append(",");});text.set(stringBuilder.substring(0,stringBuilder.length() - 1));context.write(key,text);}
}