Type: New Feature
Affects Version/s: None
Fix Version/s: None
Sawzall has a neat trick where you can do aggregations on secondary keys via maps, which is useful in cases where you might want to aggregate some data at (for example) both a country and at a city level within a single MapReduce job. We had a thread on crunch-user about this pattern:
The pattern ends up looking something like this:
// Define a table that has long values at both the K and the <K, String> levels.
PTable<K, Pair<Long, Map<String, Long>>> in = ...;
// Define and apply an Aggregator that can handle sums at both levels within a single MR job.
Aggregator<Pair<Long, Map<String, Long>>> a = pairAggregator(SUM_LONGS(), map(Aggregators.SUM_LONGS()));
PTable<K, Pair<Long, Map<String, Long>>> out = in.groupByKey().combineValues(a);
...which would run substantially faster than executing two dependent MR jobs, one that did the city aggregation and then a second follow-up job that did the country aggregation.