2014-10-19 128 views
0

我试过使用mrjob更改wordcount示例。我的结构的项目是:无法在Mrjob中导入模块

├── input_text.txt 
├── store_xml_dir 
│   ├── xml_file.xml 
│   └── xml_parse.py 
└── wordcount.py 

和内容wordcount.py的是:

import os 
import sys 
cwdir = os.path.dirname(__file__) 
sys.path.append(cwdir) 
sys.path.append(os.path.join(cwdir, "store_xml_dir")) 

import xml_parse 
# print dir(xml_parse) <- it works here if i'd comment the rest code 

from mrjob.job import MRJob 


class MRWordFrequencyCount(MRJob): 

    def mapper(self, _, line): 
     getxml = xml_parse.GetXML() 
     print '>>>', getxml.get_strings() 

     yield "chars", len(line) 
     yield "words", len(line.split()) 
     yield "lines", 1 

    def reducer(self, key, values): 
     yield key, sum(values) 

if __name__ == '__main__': 
    MRWordFrequencyCount.run() 

当我跑,我有错误:ImportError: No module named xml_parse。为什么python在这种情况下无法导入xml_parse

+0

您需要在其他节点中放置'store_xml_dir'并将其添加到'pythonpath'。 mrjob不会将您的代码导出到其他节点。 – Mehraban 2014-10-19 10:29:51

+0

@SAM我通过使用'sys.path.append(os.path.join(cwdir,“store_xml_dir”))附加到'pythonpath'' – Trigges 2014-10-19 10:35:58

+0

似乎mrjob不会在任务跟踪器上执行该行代码。也许你需要手动完成。 – Mehraban 2014-10-19 10:38:16

回答

0

mrjob 出口的没有的MapReduce代码对你来说, 你需要它自己的出口。 但你需要明确地告诉它在configs中这样做。 (看看他们的documentation

您可以通过添加这些配置参数运行代码:

--python-archive=store_xml_dir 
0

我发现,在成员函数内进口的模块解决了这个问题对我来说。

def mapper(self, _, line): 
    import xml_parse 
    ...