package com.mongodb.hadoop.bookstore;
import com.mongodb.BasicDBObject;
import com.mongodb.hadoop.io.BSONWritable;
import com.mongodb.hadoop.io.MongoUpdateWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;
import org.apache.hadoop.mapreduce.Reducer;
import org.bson.BSONObject;
import org.bson.BasicBSONObject;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
public class TagsReducer extends Reducer<Text, BSONWritable, NullWritable, MongoUpdateWritable>
implements org.apache.hadoop.mapred.Reducer<Text, BSONWritable, NullWritable, MongoUpdateWritable> {
private MongoUpdateWritable reduceResult;
public TagsReducer() {
super();
reduceResult = new MongoUpdateWritable();
}
@Override
protected void reduce(final Text key, final Iterable<BSONWritable> values, final Context context)
throws IOException, InterruptedException {
BasicDBObject query = new BasicDBObject("_id", key.toString());
ArrayList<BSONObject> books = new ArrayList<BSONObject>();
for (BSONWritable val : values) {
books.add(val.getDoc());
}
BasicBSONObject update = new BasicBSONObject("$set", new BasicBSONObject("books", books));
reduceResult.setQuery(query);
reduceResult.setModifiers(update);
context.write(null, reduceResult);
}
@Override
public void reduce(final Text key, final Iterator<BSONWritable> values, final OutputCollector<NullWritable, MongoUpdateWritable> output,
final Reporter reporter) throws IOException {
BasicDBObject query = new BasicDBObject("_id", key.toString());
ArrayList<BSONObject> books = new ArrayList<BSONObject>();
while (values.hasNext()) {
books.add(values.next().getDoc());
}
BasicBSONObject update = new BasicBSONObject("$set", new BasicBSONObject("books", books));
reduceResult.setQuery(query);
reduceResult.setModifiers(update);
output.collect(null, reduceResult);
}
@Override
public void close() throws IOException {
}
@Override
public void configure(final JobConf job) {
}
}