Class MapReduce
Implements a simplistic version of the popular Map-Reduce algorithm. Acts like an iterator for the original passed data after each result has been processed, thus offering a transparent wrapper for results coming from any source.
Property Summary
-
$_counter protected
int
Count of elements emitted during the Reduce phase
-
$_data protected
Traversable|null
Holds the original data that needs to be processed
-
$_executed protected
bool
Whether the Map-Reduce routine has been executed already on the data
-
$_intermediate protected
array
Holds the shuffled results that were emitted from the map phase
-
$_mapper protected
callable
A callable that will be executed for each record in the original data
-
$_reducer protected
callable|null
A callable that will be executed for each intermediate record emitted during the Map phase
-
$_result protected
array
Holds the results as emitted during the reduce phase
Method Summary
-
__construct() public
Constructor
-
_execute() protected
Runs the actual Map-Reduce algorithm. This is iterate the original data and call the mapper function for each , then for each intermediate bucket created during the Map phase call the reduce function.
-
emit() public
Appends a new record to the final list of results and optionally assign a key for this record.
-
emitIntermediate() public
Appends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data.
-
getIterator() public
Returns an iterator with the end result of running the Map and Reduce phases on the original data
Method Detail
__construct() ¶ public
__construct(Traversable $data, callable $mapper, callable|null $reducer = null)
Constructor
Example:
Separate all unique odd and even numbers in an array
$data = new \ArrayObject([1, 2, 3, 4, 5, 3]);
$mapper = function ($value, $key, $mr) {
$type = ($value % 2 === 0) ? 'even' : 'odd';
$mr->emitIntermediate($value, $type);
};
$reducer = function ($numbers, $type, $mr) {
$mr->emit(array_unique($numbers), $type);
};
$results = new MapReduce($data, $mapper, $reducer);
Previous example will generate the following result:
['odd' => [1, 3, 5], 'even' => [2, 4]]
Parameters
-
Traversable
$data the original data to be processed
-
callable
$mapper the mapper callback. This function will receive 3 arguments. The first one is the current value, second the current results key and third is this class instance so you can call the result emitters.
-
callable|null
$reducer optional the reducer callback. This function will receive 3 arguments. The first one is the list of values inside a bucket, second one is the name of the bucket that was created during the mapping phase and third one is an instance of this class.
_execute() ¶ protected
_execute(): void
Runs the actual Map-Reduce algorithm. This is iterate the original data and call the mapper function for each , then for each intermediate bucket created during the Map phase call the reduce function.
Returns
void
Throws
LogicException
if emitIntermediate was called but no reducer function was provided
emit() ¶ public
emit(mixed $val, string|null $key = null): void
Appends a new record to the final list of results and optionally assign a key for this record.
Parameters
-
mixed
$val The value to be appended to the final list of results
-
string|null
$key optional and optional key to assign to the value
Returns
void
emitIntermediate() ¶ public
emitIntermediate(mixed $val, string $bucket): void
Appends a new record to the bucket labelled with $key, usually as a result of mapping a single record from the original data.
Parameters
-
mixed
$val The record itself to store in the bucket
-
string
$bucket the name of the bucket where to put the record
Returns
void
getIterator() ¶ public
getIterator(): ArrayIterator
Returns an iterator with the end result of running the Map and Reduce phases on the original data
Returns
ArrayIterator
Property Detail
$_executed ¶ protected
Whether the Map-Reduce routine has been executed already on the data
Type
bool
$_intermediate ¶ protected
Holds the shuffled results that were emitted from the map phase
Type
array
$_mapper ¶ protected
A callable that will be executed for each record in the original data
Type
callable
$_reducer ¶ protected
A callable that will be executed for each intermediate record emitted during the Map phase
Type
callable|null