Difference between revisions of "MapReduce Reducer Assignment"
Line 14: | Line 14: | ||
}</nowiki> | }</nowiki> | ||
− | we chose to go with the standard Collector<T,A,R> | + | we chose to go with the standard Collector<T,A,R> despite the extra level of indirection it requires (returning @Functional interfaces whose single abstract methods do the work). |
− | + | We provide this mythical <code>class CollectorReducerAdapter</class> as a Rosetta Stone of sorts in an effort to reveal what each method is responsible for: | |
− | |||
<nowiki>public class CollectorReducerAdapter<V, A, R> implements Reducer<V, A, R> { | <nowiki>public class CollectorReducerAdapter<V, A, R> implements Reducer<V, A, R> { |
Revision as of 18:01, 22 February 2018
Contents
Motivation
interface Collector<T,A,R>
is fundamental to the MapReduce Frameworks lab.
Background
We debated between creating our own custom Reducer<V,A,R> interface versus adopting the standard interface Collector<T,A,R> from the standard Java streams framework as the basis for the MapReduce Frameworks Lab.
While It might have been slightly less confusing at the outset if we used something like this mythical non-existant interface below:
public interface Reducer<V, A, R> { A createMutableContainer(); void accumulate(A container, V item); A combine(A containerA, A containerB); R reduce(A container); }
we chose to go with the standard Collector<T,A,R> despite the extra level of indirection it requires (returning @Functional interfaces whose single abstract methods do the work).
We provide this mythical class CollectorReducerAdapter</class> as a Rosetta Stone of sorts in an effort to reveal what each method is responsible for:
public class CollectorReducerAdapter<V, A, R> implements Reducer<V, A, R> {
private final Collector<V,A,R> collector;
public CollectorReducerAdapter(Collector<V,A,R> collector) {
this.collector = collector;
}
@Override
public A createMutableContainer() {
return collector.supplier().get();
}
@Override
public void accumulate(A container, V item) {
collector.accumulator().accept(container, item);
}
@Override
public A combine(A containerA, A containerB) {
return collector.combiner().apply(containerA, containerB);
}
@Override
public R reduce(A container) {
return collector.finisher().apply(container);
}
}
Code To Implement
ClassicReducer
class:
ClassicReducer.java
methods:
supplier
accumulator
combiner
package:
mapreduce.collector.studio
source folder:
student/src/main/java
IntSumCollector
class:
IntSumCollector.java
methods:
supplier
accumulator
combiner
finisher
package:
mapreduce.collector.intsum.studio
source folder:
student/src/main/java
Testing Your Solution
Correctness
class:
CollectorStudioTestSuite.java
package:
mapreduce
source folder:
testing/src/test/java