我刚开始学习Python,
有人知道Python(以及函数式编程语言)的函数 map()
/ reduce()
与分布式计算相关的MapReduce概念之间的关系吗?
map
为一个新对象(通常是某种字典)。然后,在由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']
def wordToDict(word):
return {word: 1}
然后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}
lambda l: reduce(countReduce, map(wordToDict, *)
)? - Andrew Jaffe[reduce(countReduce, map(wordToDict, list)), reduce(countReduce, map(wordToDict, list2))]
和map(lambda l: reduce(countReduce, map(wordToDict, l)), [list1, list2])
是相同的,我认为后者更能体现操作的精髓。 - Andrew Jaffe