package storm.applications.spout.parser; import com.google.common.collect.ImmutableList; import java.util.List; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import storm.applications.util.stream.StreamValues; /** * * @author Maycon Viana Bordin <mayconbordin@gmail.com> */ public class BeijingTaxiTraceParser extends Parser { private static final Logger LOG = LoggerFactory.getLogger(BeijingTaxiTraceParser.class); private static final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss"); private static final int ID_FIELD = 0; private static final int NID_FIELD = 1; private static final int DATE_FIELD = 2; private static final int LAT_FIELD = 3; private static final int LON_FIELD = 4; private static final int SPEED_FIELD = 5; private static final int DIR_FIELD = 6; @Override public List<StreamValues> parse(String input) { String[] fields = input.split(","); if (fields.length != 7) return null; try { String carId = fields[ID_FIELD]; DateTime date = formatter.parseDateTime(fields[DATE_FIELD]); boolean occ = true; double lat = Double.parseDouble(fields[LAT_FIELD]); double lon = Double.parseDouble(fields[LON_FIELD]); int speed = ((Double)Double.parseDouble(fields[SPEED_FIELD])).intValue(); int bearing = Integer.parseInt(fields[DIR_FIELD]); int msgId = String.format("%s:%s", carId, date.toString()).hashCode(); StreamValues values = new StreamValues(carId, date, occ, speed, bearing, lat, lon); values.setMessageId(msgId); return ImmutableList.of(values); } catch (NumberFormatException ex) { LOG.warn("Error parsing numeric value", ex); } catch (IllegalArgumentException ex) { LOG.warn("Error parsing date/time value", ex); } return null; } }