2013-04-09 91 views
1

我想加載一個json文件作爲映射函數的一部分,但它返回「目錄中沒有這樣的文件」,雖然該文件存在。MRJOB打開JSON文件 - Python

我已經打開一個文件並通過它的行解析。但是想要將它的一些值與第二個JSON文件進行比較。

from mrjob.job import MRJob 
import json 
import nltk 
import re  

WORD_RE = re.compile(r"\b[\w']+\b") 
sentimentfile = open('sentiment_word_list_stemmed.json') 

def mapper(self, _, line): 
    stemmer = nltk.PorterStemmer() 
    stems = json.loads(sentimentfile) 

    line = line.strip() 
    # each line is a json line 
    data = json.loads(line) 
    form = data.get('type', None) 

    if form == 'review': 
     bs_id = data.get('business_id', None) 
     text = data['text'] 
     stars = data['stars'] 

     words = WORD_RE.findall(text) 
     for word in words: 
     w = stemmer.stem(word) 
     senti = stems.get[w] 

     if senti: 
      yield (bs_id, (senti, 1)) 

回答

0

您正在使用json.loads()函數,同時傳入打開的文件。改爲使用json.load()(注意,不是s)。

stems = json.load(sentimentfile) 

你確實需要重新打開文件每次你打電話給你mapper()功能的時間,更好地只存儲全球:

sentimentfile = 'sentiment_word_list_stemmed.json' 

def mapper(self, _, line): 
    stemmer = nltk.PorterStemmer() 
    stems = json.load(open(sentimentfile)) 

最後但並非最不重要的,你應該使用一個絕對路徑的文件名,並不依賴於當前的工作目錄是正確的。

4

根本不應該在映射函數中打開文件。您只需要將該文件作爲STDIN傳遞或作爲映射器的第一個參數來拾取它。像這樣做:

python mrjob_program.py sentiment_word_list_stemmed.json > output 

OR

python mrjob_program.py <sentiment_word_list_stemmed.json> output 

要麼一會工夫。它說沒有這樣的文件或目錄,因爲這些映射器無法看到你指定的文件。映射器被設計爲在遠程機器上運行。即使您想從映射器中的文件中讀取數據,也需要將傳遞的文件複製到羣集中的所有機器上,這對本示例來說沒有任何意義。您實際上可以指定一個DEFAULT_INPUT_PROTOCOL,以便映射器知道您正在使用哪種類型的輸入。

下面是關於這個問題的談話,這將有助於:

http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-mrjob-distributed-computing-for-everyone-4898987/