2013-04-22 50 views
0

我試圖理解更好的大數據編程,但我幾乎對python一無所知。所以我用的MapReduce模式,實際上在python我把目錄中存儲一些文本文件說mydir,使我的數據源是:mapreduce簡單功能 - 使用python

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語法是否正確?

+0

您的語法只要你沒有SyntaxError就是「正確的」。你的命名可能會更好,你的正則表達式不能像你期望的那樣工作,但這是另一點。我強烈懷疑你的問題是從相對路徑填充你的數據源。只需打印出您的「global_file」變量以查明您是否有任何東西。 – 2013-04-22 12:08:38

+0

@brunodesthuilliers我更新了我的帖子。我仍然有一個空數組結果。當我打印出「數據源」時,我會得到正確的內容。請注意,爲了不使用「re」庫,我更改了mapfn函數。你有什麼主意嗎 ? – Newben 2013-04-22 12:48:31

回答

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

我們得到以下結果:

[email protected] ~/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大師加入。

+0

謝謝你這個完整的答案! – Newben 2013-04-24 21:42:48