肉末地图函数返回字典



>我正在使用一个名为 mincemeat.py 的mapreduce实现。它包含一个映射函数和reduce函数。首先,我将讲述我想要完成的目标。我正在做一个关于大数据的课程,那里有一个编程作业。问题是有数百个文件包含 paperid:::author1::author2::author3:::p apertitle 形式的数据

我们必须浏览所有文件并为特定作者提供他最大限度地使用的单词。所以我为它编写了以下代码。

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'([^sw-])+', '', 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: Counter({'word1':countofword1,'word2':countofword2,'word3':countofword3,..}). 

但我得到的是

authorname: (authorname, Counter({'word1': countofword1,'word2':countofword2}))

有人能说出为什么会这样吗?我不需要帮助来解决问题,我需要帮助才能知道为什么会这样!

我运行了您的代码,我看到它按预期工作。输出看起来像 {authorname : Counter({'word1':countofword1,'word2':countofword2,'word3':countofword3,..})。

可是。从此处删除代码,因为它违反了 Coursera 荣誉守则。

在计数器之前检查 reducefn 中的值数据结构。

def reducefn(key, value):
    print(value)
    return Counter(value)

相关内容

  • 没有找到相关文章

最新更新