1

我正在尝试加载一个 json 文件作为映射器函数的一部分,但它返回“目录中没有此类文件”,尽管该文件存在。

我已经打开一个文件并解析它的行。但是想将它的一些值与第二个 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))
4

2 回答 2

4

您根本不应该在映射器函数中打开文件。您只需要将文件作为 STDIN 或作为映射器获取它的第一个参数传递。像这样做:

python mrjob_program.py sentiment_word_list_stemmed.json > output

或者

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/

于 2013-04-12T20:57:30.590 回答
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))

最后但同样重要的是,您应该使用文件名的绝对路径,而不是依赖当前工作目录是否正确。

于 2013-04-09T13:01:29.030 回答