Облачная концепция карты / уменьшения очень похожа, но изменена для параллельной работы.Во-первых, каждый объект данных передается через функцию, которая map
передает его новому объекту (обычно это своего рода словарь).Затем функция 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}
И функция сокращения будет выглядеть так:
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}