首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MRJob笔记本运行IPython

从MRJob笔记本运行IPython
EN

Stack Overflow用户
提问于 2014-07-11 15:17:39
回答 2查看 2.4K关注 0票数 5

我试着从IPython笔记本上运行mrjob示例

代码语言:javascript
复制
from mrjob.job import MRJob


class MRWordFrequencyCount(MRJob):

def mapper(self, _, line):
    yield "chars", len(line)
    yield "words", len(line.split())
    yield "lines", 1

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

然后用代码运行它。

代码语言:javascript
复制
mr_job = MRWordFrequencyCount(args=["testfile.txt"])
with mr_job.make_runner() as runner:
    runner.run()
    for line in runner.stream_output():
        key, value = mr_job.parse_output_line(line)
        print key, value

并得到错误:

代码语言:javascript
复制
TypeError: <module '__main__' (built-in)> is a built-in class

有办法从IPython笔记本上运行mrjob吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-27 00:26:22

我还没有找到“完美的方法”,但您可以做的一件事是使用%%file魔术创建一个笔记本单元,将单元格内容写入文件:

代码语言:javascript
复制
%%file wordcount.py
from mrjob.job import MRJob

class MRWordFrequencyCount(MRJob):

    def mapper(self, _, line):
        yield "chars", len(line)
        yield "words", len(line.split())
        yield "lines", 1

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

然后让mrjob在以后的单元格中运行该文件:

代码语言:javascript
复制
import wordcount
reload(wordcount)

mr_job = wordcount.MRWordFrequencyCount(args=['example.txt'])
with mr_job.make_runner() as runner:
    runner.run()
    for line in runner.stream_output():
        key, value = mr_job.parse_output_line(line)
        print key, value

注意,我调用了我的文件wordcount.py,并从MRWordFrequencyCount模块导入了类MRWordFrequencyCount --文件名和模块必须匹配。另外,Python缓存导入的模块,并且当您更改wordcount.py-file时,iPython不会重新加载模块,而是使用旧的缓存模块。这就是我把reload()电话放进去的原因。

参考资料:https://groups.google.com/d/msg/mrjob/CfdAgcEaC-I/8XfJPXCjTvQJ

更新(更短)

对于较短的第二个笔记本单元,您可以通过从笔记本中调用shell来运行mrjob。

代码语言:javascript
复制
! python mrjob.py shakespeare.txt

参考资料:http://jupyter.cs.brynmawr.edu/hub/dblank/public/Jupyter%20Magics.ipynb

票数 3
EN

Stack Overflow用户

发布于 2015-07-22 14:23:51

我怀疑这是由于这一限制在MRJob网站上说的:

带有作业类的文件被发送到Hadoop以运行。因此,作业文件不能尝试启动Hadoop作业,否则您将递归地创建Hadoop作业!运行作业的代码应该只在Hadoop上下文之外运行。

或者,可能是因为您没有以下内容(参考文献):

代码语言:javascript
复制
if __name__ == '__main__':  
  MRWordCounter.run()  # where MRWordCounter is your job class
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24701101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档