类 MapReduce
实现一个流行的 Map-Reduce 算法的简化版本。在每个结果被处理后,它就像原始数据的迭代器,从而为来自任何来源的结果提供一个透明的包装器。
属性摘要
-
$_counter protected
int
在 Reduce 阶段发出的元素计数
-
$_data protected
iterable
保存需要处理的原始数据
-
$_executed protected
bool
Map-Reduce 程序是否已在数据上执行
-
$_intermediate protected
array
保存从映射阶段发出的随机结果
-
$_mapper protected
callable
一个可调用函数,它将对原始数据中的每个记录执行
-
$_reducer protected
callable|null
一个可调用函数,它将在映射阶段发出的每个中间记录上执行
-
$_result protected
array
保存 Reduce 阶段发出的结果
方法摘要
-
__construct() public
构造函数
-
_execute() protected
运行实际的 Map-Reduce 算法。这将迭代原始数据并为每个数据调用映射器函数,然后为映射阶段创建的每个中间桶调用 Reduce 函数。
-
emit() public
将新记录附加到最终结果列表,并可选地为该记录分配一个键。
-
emitIntermediate() public
将新记录附加到标记为 $key 的桶,通常是映射原始数据中的单个记录的结果。
-
getIterator() public
返回一个迭代器,其中包含对原始数据运行 Map 和 Reduce 阶段的最终结果
方法详情
__construct() ¶ public
__construct(iterable $data, callable $mapper, callable|null $reducer = null)
构造函数
示例
将数组中的所有唯一奇数和偶数分开
$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);
前面的示例将生成以下结果
['odd' => [1, 3, 5], 'even' => [2, 4]]
参数
-
iterable
$data 要处理的原始数据。
-
callable
$mapper 映射器回调。此函数将接收 3 个参数。第一个是当前值,第二个是当前结果键,第三个是该类实例,因此您可以调用结果发射器。
-
callable|null
$reducer optional 减速器回调。此函数将接收 3 个参数。第一个是桶内的值列表,第二个是映射阶段创建的桶的名称,第三个是该类的实例。
_execute() ¶ protected
_execute(): void
运行实际的 Map-Reduce 算法。这将迭代原始数据并为每个数据调用映射器函数,然后为映射阶段创建的每个中间桶调用 Reduce 函数。
返回
void
抛出
LogicException
如果调用了 emitIntermediate 但没有提供减速器函数
emit() ¶ public
emit(mixed $val, mixed $key = null): void
将新记录附加到最终结果列表,并可选地为该记录分配一个键。
参数
-
mixed
$val 要附加到最终结果列表的值
-
mixed
$key optional 要分配给值的可选键
返回
void
emitIntermediate() ¶ public
emitIntermediate(mixed $val, mixed $bucket, mixed $key = null): void
将新记录附加到标记为 $key 的桶,通常是映射原始数据中的单个记录的结果。
参数
-
mixed
$val 要存储在桶中的记录本身
-
mixed
$bucket 放置记录的桶的名称
-
mixed
$key optional 要分配给值的可选键
返回
void
getIterator() ¶ public
getIterator(): Traversable
返回一个迭代器,其中包含对原始数据运行 Map 和 Reduce 阶段的最终结果
返回
Traversable