我写了一个简单的地图并在python中减少程序来计算每个句子的数字,然后将相同的数字组合在一起。即假设句子1有10个单词,句子2有17个单词,句子3有10个单词。最终结果将是:
10 \t 2
17 \t 1
映射器功能是:
import sys
import re
pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*")
for line in sys.stdin:
word = str(len(line.split())) # calculate how many words for each line
count = str(1)
print "%s\t%s" % (word, count)
reducer功能是:
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
line = line.strip()
word, count = line.split('\t')
try:
count = int(count)
word = int(word)
except ValueError:
continue
if current_word == word:
current_count += count
else:
if current_word:
print "%s\t%s" % (current_word, current_count)
current_count = count
current_word = word
if current_word == word:
print "%s\t%s" %(current_word, current_count)
我在本地计算机上测试了文件的前200行: head -n 200 sentences.txt | python mapper.py |排序| python reducer.py 结果是正确的。然后我使用了Amazon MapReduce流服务,它在reducer步骤失败了。所以我将mapper函数中的print更改为:
print "LongValueSum" + word + "\t" + "1"
这适用于mapreduce流服务中的默认聚合。在这种情况下,我不需要reducer.py函数。我从大文件sentence.txt得到最终结果。但我不知道为什么我的reducer.py函数失败了。谢谢!
答案 0 :(得分:1)
知道了!一个“愚蠢”的错误。当我测试它时,我使用类似python mapper.py的东西。但对于mapreduce,我需要让它可执行。所以只需添加
# !/usr/bin/env python
一开始。