2017-07-18 60 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

相關問題