2. TP1 : Map reduce en python
Le Hello World du Map Reduce : compter les mots
Vous avez à coder plusieurs modules :
Mapper.py
Qui lit un texte sur l’entrée standard
Et qui renvoie un doublet : mot tabulation (t) 1 retour à la ligne (n)
sur la sortie standard
Reducer.py
Qui lit les doublets depuis l’entrée standard
Qui calcule le nombre d’occurrence d’un mot
2
4. Pure Python fonction map 4
map(function_to_apply, list_of_inputs)
Cela permet de remplacer un code comme celui-ci
item = [1,2,3,4,5]
carres = []
for i in items:
carres.append(i**2)
item = [1,2,3,4,5]
Carres = list(map(lambda x: x**2, items))
par
5. Pure Python fonction filter 5
filter(function_to_apply, list_of_inputs)
Agit comme une boucle mais c’est une fonction interne, plus rapide
liste = range(-5, 5)
negatifs = list(filter(lambda x: x<0, liste))
[-5, -4, -3, -2, -1]
renvoie
6. Pure Python fonction reduce 6
reduce(function_to_apply, list_of_inputs)
Cela permet de remplacer un code comme celui-ci
produit = 1
list = [1, 2, 3, 4]
for num in list:
produit = produit * num
from functools import reduce
list = [1, 2, 3, 4]
produit = reduce((lambda x,y: x*y), list)
par
7. Map 7
#!/usr/bin/env python
"""mapper.py"""
import sys
# input comes from STDIN (standard input)
for line in sys.stdin:
# remove leading and trailing whitespace
line = line.strip()
# split the line into words
words = line.split()
# increase counters
for word in words:
# write the results to STDOUT (standard output);
# what we output here will be the input for the
# Reduce step, i.e. the input for reducer.py
#
# tab-delimited; the trivial word count is 1
print('%st%s' % (word, 1) )
8. Reduce 8
#!/usr/bin/env python
from operator import itemgetter
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
line = line.strip()
word, count = line.split('t', 1)
try:
count = int(count)
except ValueError:
# count was not a number, so silently
# ignore/discard this line
continue
if current_word == word:
current_count += count
else:
if current_word:
print('%st%s' % (current_word, current_count))
current_count = count
current_word = word
if current_word == word:
print('%st%s' % (current_word, current_count))
9. Pipe (/Paipe/)
Toutes les commandes un*x ont trois moyens de communiquer avec
l’utilisateur
Un moyen de lire ce qu’il demande (par défaut par le clavier) : stdin
Un moyen de transmettre des informations (par défaut à l’écran) : stdout
Un moyen de signaler les erreurs (par défaut à l’écran) : stderr
Un*x permet de chainer les commandes
On relie le stdout d’un programme au stdin du suivant
C’est la commande pipe, notée |
9