我对Spark非常陌生,我已经尝试了一段时间来让Spark理解我的JSON输入,但是我一直没有管理好。总之,我使用Spark的ALS算法来给出建议。当我提供一个csv文件作为输入时,一切正常。但是,我的输入实际上是一个json,如下所示:
all_user_recipe_rating = [{'rating': 1, 'recipe_id': 8798, 'user_id': 2108}, {'rating': 4, 'recipe_id': 6985, 'user_id': 4236}, {'rating': 4, 'recipe_id': 13572, 'user_id': 2743}, {'rating': 4, 'recipe_id': 6312, 'user_id': 3156}, {'rating': 1, 'recipe_id': 12836, 'user_id': 768}, {'rating': 1, 'recipe_id': 9237, 'user_id': 1599}, {'rating': 2, 'recipe_id': 16946, 'user_id': 2687}, {'rating': 2, 'recipe_id': 20728, 'user_id': 58}, {'rating': 4, 'recipe_id': 12921, 'user_id': 2221}, {'rating': 2, 'recipe_id': 10693, 'user_id': 2114}, {'rating': 2, 'recipe_id': 18301, 'user_id': 4898}, {'rating': 2, 'recipe_id': 9967, 'user_id': 3010}, {'rating': 2, 'recipe_id': 16393, 'user_id': 4830}, {'rating': 4, 'recipe_id': 14838, 'user_id': 583}]
ratings_RDD = self.spark.parallelize(all_user_recipe_rating)
ratings = ratings_RDD.map(lambda row:
(Rating(int(row['user_id']),
int(row['recipe_id']),
float(row['rating']))))
model = self.build_model(ratings)
这是我看到一些例子后想到的,但我得到的是:
^{pr2}$以及
File "/usr/local/spark/python/pyspark/mllib/recommendation.py", line 147, in <lambda>
user_product = user_product.map(lambda u_p: (int(u_p[0]), int(u_p[1])))
TypeError: int() argument must be a string or a number, not 'Rating'
有人能帮帮我吗?:)谢谢!在
嗯
你的错误是由一件事造成的。在
这个异常是关于ALS function的函数
predictAll
。在这里的问题是,您试图将一个Rating对象发送给需要接收
RDD<int, int>
的函数我拿走了你的代码,构建了你需要的:
您的JSON没有错,当您调用
predictAll
时,您遇到的问题是您发送的是Rating
对象,而不是RDD<int, int>
相关问题 更多 >
编程相关推荐