python map reduce和cloud-computing map/reduce之间的关系?

McA*_*gee 6 python cloud mapreduce

我是Python新手,

有人知道Python(和函数式语言)函数map()/ reduce()与分布式计算相关的MapReduce概念之间的关系是什么?

Aar*_*our 8

map/reduce的云概念非常相似,但改为并行工作.首先,每个数据对象都通过一个函数传递map给一个新对象(通常是某种字典).然后,reduce在返回的对象对上调用函数,map直到只剩下一个.这是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']
Run Code Online (Sandbox Code Playgroud)

map函数如下所示:

def wordToDict(word):
  return {word: 1}
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样映射/减少:

reduce(countReduce, map(wordToDict, list + list2))

>>> {'a': 3, 'foobar': 1, 'b': 2, 'bar': 6, 'foo': 5}
Run Code Online (Sandbox Code Playgroud)

但你也可以这样做(这是并行化会做的):

reduce(countReduce, [reduce(countReduce, map(wordToDict, list)), reduce(countReduce, map(wordToDict, list2))])

>>> {'a': 3, 'foobar': 1, 'b': 2, 'foo': 5, 'bar': 6}
Run Code Online (Sandbox Code Playgroud)