我是Python的新手,
有人知道Python(和函数式语言)函数map()
/ reduce()
之间的关系以及与分布式计算相关的MapReduce概念吗?
答案 0 :(得分:8)
map / reduce的云概念非常相似,但改为并行工作。首先,每个数据对象都通过一个函数map
传递给一个新对象(通常是某种字典)。然后,在reduce
返回的对象对上调用map
函数,直到只剩下一个。{1}}函数。这是map / reduce操作的结果。
一个重要的考虑因素是,由于并行化,reduce
函数必须能够从map
函数以及先前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}
答案 1 :(得分:2)
实际上这些概念有些不同,而且常见的名称具有误导性。
在函数式编程中(Python借用了这些函数):
map
将一些函数应用于列表的所有元素并返回一个新列表reduce
应用某些函数来聚合某些列表中的所有值以获得单个值。在分布式计算中MapReduce:
请注意,映射器始终不会为每个输入对生成一个输出对,也不会将reducer(键,值列表)精确地减少到一个输出对。 Mapper和reducer可以输出他们想要的任何东西。例如,映射器可用于过滤对 - 在这种情况下,它为某些输入对生成输出对而忽略其他对。对于每个映射器/减速器输入对(或其中一些),产生多于一对的情况并不罕见。
但在大多数情况下,MapReduce可以与reduce(reduce_function, map(map_function, list))
类似或几乎相似的方式工作 - 映射器通常对每个输入进行一些计算,而reducer通常以某种方式聚合值列表。对于任何map_function
和reduce_function
,可以在MapReduce中表达,但反之亦然。