package hip.ch7.friendsofafriend; import org.apache.commons.lang.StringUtils; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public final class SortMapReduce { public static class Map extends Mapper<Text, Text, Person, Person> { private Person outputKey = new Person(); private Person outputValue = new Person(); @Override protected void map(Text key, Text value, Context context) throws IOException, InterruptedException { String[] parts = StringUtils.split(value.toString()); String name = parts[0]; int commonFriends = Integer.valueOf(parts[1]); outputKey.set(name, commonFriends); outputValue.set(key.toString(), commonFriends); context.write(outputKey, outputValue); outputValue.set(name, commonFriends); outputKey.set(key.toString(), commonFriends); context.write(outputKey, outputValue); } } public static class Reduce extends Reducer<Person, Person, Text, Text> { private Text name = new Text(); private Text potentialFriends = new Text(); @Override public void reduce(Person key, Iterable<Person> values, Context context) throws IOException, InterruptedException { StringBuilder sb = new StringBuilder(); // the 2nd-degree friends will be sorted by the number // of common friends, so emit the top 10 // int count = 0; for (Person potentialFriend : values) { if(sb.length() > 0) { sb.append(","); } sb.append(potentialFriend.getName()) .append(":") .append(potentialFriend.getCommonFriends()); if (++count == 10) { break; } } name.set(key.getName()); potentialFriends.set(sb.toString()); context.write(name, potentialFriends); } } }