package eu.dnetlib.iis.common.protobuf;
import com.google.protobuf.Message;
import org.apache.avro.generic.IndexedRecord;
import org.apache.avro.mapred.AvroKey;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.log4j.Logger;
import java.io.IOException;
/**
* @author Mateusz Fedoryszak (m.fedoryszak@icm.edu.pl)
*/
public class AvroToProtoBufOneToOneMapper<IN extends IndexedRecord, OUT extends Message>
extends Mapper<AvroKey<IN>, NullWritable, Text, BytesWritable> {
private static final String CONVERTER_CLASS_PROPERTY = "converter_class";
private static final Logger log = Logger.getLogger(AvroToProtoBufOneToOneMapper.class);
private final Text keyWritable = new Text();
private final BytesWritable valueWritable = new BytesWritable();
private AvroToProtoBufConverter<IN, OUT> converter;
@SuppressWarnings("unchecked")
@Override
public void setup(Context context) throws IOException, InterruptedException {
Class<?> converterClass = context.getConfiguration().getClass(CONVERTER_CLASS_PROPERTY, null);
if (converterClass == null) {
throw new IOException("Please specify " + CONVERTER_CLASS_PROPERTY);
}
try {
converter = (AvroToProtoBufConverter<IN, OUT>) converterClass.newInstance();
} catch (ClassCastException e) {
throw new IOException(
"Class specified in " + CONVERTER_CLASS_PROPERTY + " doesn't implement AvroToProtoBufConverter", e);
} catch (Exception e) {
throw new IOException(
"Could not instantiate specified AvroToProtoBufConverter class, " + converterClass, e);
}
}
@Override
public void map(AvroKey<IN> avro, NullWritable ignore, Context context)
throws IOException, InterruptedException {
String key = null;
try {
key = converter.convertIntoKey(avro.datum());
keyWritable.set(key);
byte[] value = converter.convertIntoValue(avro.datum()).toByteArray();
valueWritable.set(value, 0, value.length);
context.write(keyWritable, valueWritable);
} catch (Exception e) {
log.error("Error" + (key != null ? " while processing " + key : ""), e);
}
}
}