package mil.nga.giat.geowave.mapreduce; import java.io.IOException; import mil.nga.giat.geowave.mapreduce.input.GeoWaveInputFormat; import mil.nga.giat.geowave.mapreduce.input.GeoWaveInputKey; import org.apache.hadoop.io.ObjectWritable; import org.apache.hadoop.mapreduce.ReduceContext; import org.apache.hadoop.mapreduce.Reducer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This abstract class can be extended by GeoWave analytics. It handles the * conversion of native GeoWave objects into objects that are writable. It is a * reducer that converts to writable objects for the output. This conversion * will only work if the data adapter implements HadoopDataAdapter. */ public abstract class GeoWaveWritableOutputReducer<KEYIN, VALUEIN> extends Reducer<KEYIN, VALUEIN, GeoWaveInputKey, ObjectWritable> { protected static final Logger LOGGER = LoggerFactory.getLogger(GeoWaveWritableOutputReducer.class); protected HadoopWritableSerializationTool serializationTool; @Override protected void reduce( final KEYIN key, final Iterable<VALUEIN> values, final Reducer<KEYIN, VALUEIN, GeoWaveInputKey, ObjectWritable>.Context context ) throws IOException, InterruptedException { reduceWritableValues( key, values, context); } protected void reduceWritableValues( final KEYIN key, final Iterable<VALUEIN> values, final Reducer<KEYIN, VALUEIN, GeoWaveInputKey, ObjectWritable>.Context context ) throws IOException, InterruptedException { reduceNativeValues( key, values, new NativeReduceContext( context, serializationTool)); } protected abstract void reduceNativeValues( final KEYIN key, final Iterable<VALUEIN> values, final ReduceContext<KEYIN, VALUEIN, GeoWaveInputKey, Object> context ) throws IOException, InterruptedException; @Override protected void setup( final Reducer<KEYIN, VALUEIN, GeoWaveInputKey, ObjectWritable>.Context context ) throws IOException, InterruptedException { serializationTool = new HadoopWritableSerializationTool( GeoWaveInputFormat.getJobContextAdapterStore(context)); } }