package tap.sample;
import tap.CommandOptions;
import tap.Pipe;
import tap.Tap;
import tap.TapMapper;
import tap.TapReducer;
import tap.formats.tapproto.Testmsg;
/*
* usage: -i share/securities_data.tapproto -o /tmp/out -f
*/
public class TransactionSummary {
public static void main(String[] args) throws Exception {
CommandOptions o = new CommandOptions(args);
/* Set up a basic pipeline of map reduce */
Tap t = new Tap(o).named("TransactionSummary");
/* Parse options - just use the standard options - input and output location, time window, etc. */
t.getConf().setJarByClass(TransactionSummary.class);
if (o.input == null) {
System.err.println("Must specify input directory");
return;
}
if (o.output == null) {
System.err.println("Must specify output directory");
return;
}
t.createPhase().reads(o.input).map(Mapper.class).reduce(Reducer.class).groupBy("id").writes(o.output);
t.make();
}
public static class Mapper extends TapMapper<Testmsg.SecuritiesRecord, Testmsg.SecuritiesRecord> {
public void map(Testmsg.SecuritiesRecord msg, Pipe<Testmsg.SecuritiesRecord> out)
{
out.put(msg);
}
}
public static class Reducer extends TapReducer<Testmsg.SecuritiesRecord, Testmsg.SecuritiesRecordSummary> {
Testmsg.SecuritiesRecordSummary summary;
public void reduce(Pipe<Testmsg.SecuritiesRecord> in, Pipe<Testmsg.SecuritiesRecordSummary> out)
{
int i = 0;
int value = 0;
String desc = null;
long id = 0;
for(Testmsg.SecuritiesRecord rec : in)
{
i++;
value += rec.getStrike();
desc = rec.getDesc();
id = rec.getId();
}
summary = Testmsg.SecuritiesRecordSummary.newBuilder().setDesc(desc).
setId(id).setNumTransactions(i).setTotalValue(value).build();
out.put(summary);
System.out.println(summary.toString());
}
}
}