package mil.nga.giat.geowave.examples.ingest.bulk;
import java.io.IOException;
import java.util.List;
import mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter;
import mil.nga.giat.geowave.core.geotime.GeometryUtils;
import mil.nga.giat.geowave.core.geotime.ingest.SpatialDimensionalityTypeProvider;
import mil.nga.giat.geowave.core.store.adapter.WritableDataAdapter;
import mil.nga.giat.geowave.core.store.data.VisibilityWriter;
import mil.nga.giat.geowave.core.store.data.visibility.UnconstrainedVisibilityHandler;
import mil.nga.giat.geowave.core.store.data.visibility.UniformVisibilityWriter;
import mil.nga.giat.geowave.core.store.index.PrimaryIndex;
import mil.nga.giat.geowave.datastore.accumulo.util.AccumuloKeyValuePair;
import mil.nga.giat.geowave.datastore.accumulo.util.AccumuloKeyValuePairGenerator;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Value;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.opengis.feature.simple.SimpleFeature;
import com.vividsolutions.jts.geom.Coordinate;
public class SimpleFeatureToAccumuloKeyValueMapper extends
Mapper<LongWritable, Text, Key, Value>
{
private final WritableDataAdapter<SimpleFeature> adapter = new FeatureDataAdapter(
GeonamesSimpleFeatureType.getInstance());
private final PrimaryIndex index = new SpatialDimensionalityTypeProvider().createPrimaryIndex();
private final VisibilityWriter<SimpleFeature> visibilityWriter = new UniformVisibilityWriter<SimpleFeature>(
new UnconstrainedVisibilityHandler<SimpleFeature, Object>());
private final AccumuloKeyValuePairGenerator<SimpleFeature> generator = new AccumuloKeyValuePairGenerator<SimpleFeature>(
adapter,
index,
visibilityWriter);
private SimpleFeature simpleFeature;
private List<AccumuloKeyValuePair> keyValuePairs;
private final SimpleFeatureBuilder builder = new SimpleFeatureBuilder(
GeonamesSimpleFeatureType.getInstance());
private String[] geonamesEntryTokens;
private String geonameId;
private double longitude;
private double latitude;
private String location;
@Override
protected void map(
final LongWritable key,
final Text value,
final Context context )
throws IOException,
InterruptedException {
simpleFeature = parseGeonamesValue(value);
// build Geowave-formatted Accumulo [Key,Value] pairs
keyValuePairs = generator.constructKeyValuePairs(
adapter.getAdapterId().getBytes(),
simpleFeature);
// output each [Key,Value] pair to shuffle-and-sort phase where we rely
// on MapReduce to sort by Key
for (final AccumuloKeyValuePair accumuloKeyValuePair : keyValuePairs) {
context.write(
accumuloKeyValuePair.getKey(),
accumuloKeyValuePair.getValue());
}
}
private SimpleFeature parseGeonamesValue(
final Text value ) {
geonamesEntryTokens = value.toString().split(
"\\t"); // Exported Geonames entries are tab-delimited
geonameId = geonamesEntryTokens[0];
location = geonamesEntryTokens[1];
latitude = Double.parseDouble(geonamesEntryTokens[4]);
longitude = Double.parseDouble(geonamesEntryTokens[5]);
return buildSimpleFeature(
geonameId,
longitude,
latitude,
location);
}
private SimpleFeature buildSimpleFeature(
final String featureId,
final double longitude,
final double latitude,
final String location ) {
builder.set(
"geometry",
GeometryUtils.GEOMETRY_FACTORY.createPoint(new Coordinate(
longitude,
latitude)));
builder.set(
"Latitude",
latitude);
builder.set(
"Longitude",
longitude);
builder.set(
"Location",
location);
return builder.buildFeature(featureId);
}
}