2017-07-18 42 views
-1

我已经从该超链接下载movielens数据集ml-100k.zip(它是一个电影和用户信息数据集,它位于旧数据集选项卡中) 我已经写了简单的MapReduce代码如下所示;如何在命令行运行python程序之前将数据与python代码集成

from mrjob.job import MrJob 

class MoviesByUserCounter(MRJob): 
    def mapper(self , key ,line): 
     (userID,movieID,rating,timestamp)=line.split('\t') 
     yield userID,movieID 

    def reducer(self , user , movies): 
     numMovies=0 
     for movie in movies: 
      numMovies=numMovies+1 

     yield user,numMovies 

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

我使用python 3.5.3版本和PyCharm社区版作为python ide。

我曾尝试在命令行

python my_code.py 

上,但正如我竟然指望它的工作原理,但它无论如何不能等待响应它不起作用。

Running step 1 of 1... 
reading from STDIN 

我是怎样把数据(u.data:它已经运行了,而实际上它仍然会on.it仅在命令行上写它是数据文件,在ML- 100k.zip)在我的python程序代码中成功执行?如果还有其他解决方案,它也会很棒。

在此先感谢。

+1

https://pythonhosted.org/mrjob/guides/quickstart.html#running-your-job-different-ways – Goyo

+0

非常感谢Goyo,但在我问之前,我也试过了。它没有再次工作。 – pcpcne

+0

你可以看看[argparse模块](https://pypi.python.org/pypi/argparse) –

回答

0

如果我没有弄错,你想给你的数据作为命令行参数。

你会想这样做使用sys.argv。除此之外,请查看CLI(命令行界面)库。

实施例:

import sys 

def main(arg1, arg2, *kwargs) 
    #do something 
if __name__ == "__main__": 
    #there are not enough args 
    if len(sys.argv) < 3: 
     raise SyntaxError("Too few arguments.") 
    if len(sys.argv) != 3: 
     # There are keyword arguments 
     main(sys.argv[1], sys.argv[2], *sys.argv[3:]) 
    else: 
     # no keyword args. 
     main(sys.argv[1], sys.argv[2]) 

以这种方式,可以在形式a=1传递是依赖于位置,像正常蟒位置参数的参数,对于前两个和关键字参数。

使用例:

传送数据文件作为第一个参数和参数作为第二

python my_code.py data.zip 0.1 

如果您要使用几个命令行参数的更多,你将要花费的时间与一个CLI库,以便他们不再依赖于位置。

+0

非常感谢Jeremy。 – pcpcne