我从该超链接ml-100k.zip下载了movielens数据集(它是一个电影和用户信息数据集,它位于较旧的数据集选项卡中) 我已经编写了如下的简单MapReduce代码;
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
我怎样才能在命令行的python程序代码中成功提供数据(u.data:它是ml-100k.zip中的数据文件)?如果还有其他解决方案,它也会很棒
提前致谢。
答案 0 :(得分:1)
如果我没有弄错,你想把你的数据作为命令行参数。
您希望使用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])
通过这种方式,您可以传递与位置相关的参数,例如普通的python位置参数,前两个参数和a=1
形式的关键字参数。
使用示例:
将数据文件作为第一个参数传递,将参数作为第二个参数传递
python my_code.py data.zip 0.1
如果您将使用多个命令行参数,则需要花时间使用CLI库,以使它们不再依赖于位置。