我正在使用名为mincemeat.py的map reduce实现。它包含一个map函数和reduce函数。首先,我将告诉我要完成的任务。我正在做一个关于bigdata的课程,其中有一个编程任务。问题是有数百个文件包含paperid ::: author1 :: author2 :: author3 ::: papertitle
形式的数据我们必须浏览所有文件并为特定作者提供他最常使用的单词。所以我为它编写了以下代码。
import re
import glob
import mincemeat
from collections import Counter
text_files = glob.glob('test/*')
def file_contents(file_name):
f = open(file_name)
try:
return f.read()
finally:
f.close()
datasource = dict((file_name, file_contents(file_name)) for file_name in text_files)
def mapfn(key, value):
for line in value.splitlines():
wordsinsentence = line.split(":::")
authors = wordsinsentence[1].split("::")
# print authors
words = str(wordsinsentence[2])
words = re.sub(r'([^\s\w-])+', '', words)
# re.sub(r'[^a-zA-Z0-9: ]', '', words)
words = words.split(" ")
for author in authors:
for word in words:
word = word.replace("-"," ")
word = word.lower()
yield author, word
def reducefn(key, value):
return Counter(value)
s = mincemeat.Server()
s.datasource = datasource
s.mapfn = mapfn
s.reducefn = reducefn
results = s.run_server(password="changeme")
# print results
i = open('outfile','w')
i.write(str(results))
i.close()
我现在的问题是,对于所有作者来说,reduce函数必须接收authorname和他在标题中使用的所有单词。所以我期待输出像
{authorname: Counter({'word1':countofword1,'word2':countofword2,'word3':countofword3,..}).
但我得到的是
authorname: (authorname, Counter({'word1': countofword1,'word2':countofword2}))
有人可以说出为什么会这样吗?我不需要帮助来解决这个问题,我需要帮助才能知道为什么会这样!
答案 0 :(得分:1)
我运行了你的代码,我发现它按预期工作。输出看起来像{authorname:Counter({'word1':countofword1,'word2':countofword2,'word3':countofword3,..})。
那就是说。 从此处删除代码,因为它违反了Coursera荣誉准则。
答案 1 :(得分:0)
在Counter。之前检查reducefn中的值数据结构。
def reducefn(key, value):
print(value)
return Counter(value)