MRJOB打开JSON文件-Python

MRJOB打开JSON文件-Python,python,mrjob,Python,Mrjob,我试图加载一个json文件作为mapper函数的一部分,但它返回“目录中没有这样的文件”,尽管该文件存在 我已经在打开一个文件并解析它的行。但是我想将它的一些值与第二个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.js

我试图加载一个json文件作为mapper函数的一部分,但它返回“目录中没有这样的文件”,尽管该文件存在

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

您正在使用
json.loads()
函数,同时传入一个打开的文件。使用
json.load()
(注意,没有
s

每次调用
mapper()
函数时都需要重新打开文件,最好只全局存储文件名:

sentimentfile = 'sentiment_word_list_stemmed.json'

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

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

在传递打开的文件时,您使用的是
json.loads()
函数。使用
json.load()
(注意,没有
s

每次调用
mapper()
函数时都需要重新打开文件,最好只全局存储文件名:

sentimentfile = 'sentiment_word_list_stemmed.json'

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

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

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

python mrjob_program.py sentiment_word_list_stemmed.json > output

python mrjob\u program.py输出
任何一个都可以。它说没有这样的文件或目录,因为这些映射程序无法看到您指定的文件。映射器设计用于在远程机器上运行。即使您想从mapper中读取文件,您也需要复制要传递给集群中所有机器的文件,这在本例中没有实际意义。实际上,您可以指定一个默认的输入协议,以便映射程序也知道您使用的是哪种类型的输入

以下是一个关于该主题的演讲,将有助于:


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

python mrjob_program.py sentiment_word_list_stemmed.json > output

python mrjob\u program.py输出
任何一个都可以。它说没有这样的文件或目录,因为这些映射程序无法看到您指定的文件。映射器设计用于在远程机器上运行。即使您想从mapper中读取文件,您也需要复制要传递给集群中所有机器的文件,这在本例中没有实际意义。实际上,您可以指定一个默认的输入协议,以便映射程序也知道您使用的是哪种类型的输入

以下是一个关于该主题的演讲,将有助于: