map/reduce的云概念非常相似,但改为并行工作。首先,每个数据对象通过一个函数传递给一个新对象(通常是某种字典)。然后,对map返回的对象对调用reduce函数,直到只剩下一个。这是map/reduce操作的结果。在
一个重要的考虑因素是,由于并行化,reduce函数必须能够接收来自map函数的对象以及来自之前的reduce函数的对象。当您考虑并行化如何进行时,这会更有意义。许多机器将各自的数据缩减为单个对象,然后这些对象将被缩减为最终输出。当然,如果有大量的数据,这可能会发生在多个层中。在
在下面的一个简单的框架中,您可以使用下面的示例来减少单词的数量:list = ['a', 'foo', 'bar', 'foobar', 'foo', 'a', 'bar', 'bar', 'bar', 'bar', 'foo']
list2 = ['b', 'foo', 'foo', 'b', 'a', 'bar']
映射函数如下所示:
^{pr2}$
reduce函数如下所示:def countReduce(d1, d2):
out = d1.copy()
for key in d2:
if key in out:
out[key] += d2[key]
else:
out[key] = d2[key]
return out
然后您可以这样映射/减少:reduce(countReduce, map(wordToDict, list + list2))
>>> {'a': 3, 'foobar': 1, 'b': 2, 'bar': 6, 'foo': 5}
但您也可以这样做(并行化就是这样做的):reduce(countReduce, [reduce(countReduce, map(wordToDict, list)), reduce(countReduce, map(wordToDict, list2))])
>>> {'a': 3, 'foobar': 1, 'b': 2, 'foo': 5, 'bar': 6}