mapreduce 简单函数 - 使用 python

Posted

技术标签:

【中文标题】mapreduce 简单函数 - 使用 python【英文标题】:mapreduce simple function - using python 【发布时间】:2013-04-22 11:29:17 【问题描述】:

我正在尝试更好地理解大数据编程,但我对 python 几乎一无所知。所以我使用 mapreduce 范式,实际上在 python 中我处理存储在某个目录中的一些文本文件,比如mydir,所以我的数据源是:

global_file = glob.glob("mydir/*")

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 global_file)

那么我的mapreduce函数是

#each line in each text file is structured as follow : paper-id:::author1::author2::…. ::authorN:::title
def mapfn(k, v):
    for w in v.splitlines():
        separator = w.split('\:\:|\:\:\:')
        for x in separator[1:len(separator)-1]:
            for y in separator[-1].split():
                yield x + y, 1

首先,kv 将代表一个键值对,其中k 是文件的ID,v 是后一个文件的内容。 (最后我想获取按作者分组的每个单词的出现次数)

现在的问题是,当我运行算法时,我得到一个空白数组结果。我的 python 语法正确吗?

【问题讨论】:

只要您没有 SyntaxError,您的语法就是“正确的”。您的命名可能会更好,并且您的正则表达式无法按您预期的那样工作,但这是另一点。我强烈怀疑您的问题是从相对路径填充数据源。只需打印出你的“global_file”变量,看看你是否得到了什么。 @brunodesthuilliers 我更新了我的帖子。我仍然有一个空数组结果。当我打印出“数据源”时,我得到了正确的内容。请注意,为了不使用“re”库,我更改了 mapfn 函数。你有什么想法吗? 【参考方案1】:

我用更好的命名和正确的拆分正则表达式部分重写了您的 mapfn 函数,并添加了一个简单的测试:

import re

datasource = 
    "foo":(
        "paper-1:::author1::author2::authorN:::title1\n" 
        "paper-2:::author21::author22::author23::author2N:::title2\n"
        "paper-3:::author31::author32:::title3"
        )
    

def mapfn(k, v):
    for line in v.splitlines():
        data = re.split(r":2,3", line)
        words = data[-1].split()
        for author in data[1:-1]:
            for word in words:
                yield author + word, 1


def main():
    for k, v in datasource.items():
        for result in mapfn(k, v):
            print result

if __name__ == "__main__":
    main()

这会产生以下结果:

bruno@betty ~/Work/playground $ python mapf.py 
('author1title1', 1)
('author2title1', 1)
('authorNtitle1', 1)
('author21title2', 1)
('author22title2', 1)
('author23title2', 1)
('author2Ntitle2', 1)
('author31title3', 1)
('author32title3', 1)

不确定这是您所期望的,但至少它会产生一些输出。到目前为止,我还没有任何使用 mapReduce 的实践经验,因此您要么必须详细说明上下文以及如何运行代码和/或等待本地 mapReduce 专家介入。

【讨论】:

以上是关于mapreduce 简单函数 - 使用 python的主要内容,如果未能解决你的问题,请参考以下文章

MapReduce简介

MapReduce机制

如何使用mapreduce实现两表join

什么是MapReduce?

python 简单的Pytho WebSocket

pytho系统学习:第二周之字符串函数练习