【发布时间】:2016-02-28 22:57:58
【问题描述】:
我有一个 CSV 文件,如下所示:
customer_ID, location, ....other info..., item-bought, score
我正在尝试在 Spark 中构建一个协同过滤推荐器。 Spark 获取以下形式的数据:
userID, itemID, value
但我的数据更长,我希望使用所有用户的信息,而不仅仅是 userID。我尝试将一列中的列分组为:
(customerID,location,....),itemID,score
但是ALS.train 给了我这个错误:
TypeError: int() 参数必须是字符串或数字,而不是“元组”
如何让 spark 获取多个键/值,而不仅仅是三列? 谢谢
【问题讨论】:
-
如果 train() 想要一个数字字符串,这表明它需要某种标识符。您可以将列值混合在一起并制作长字符串,或者甚至更好地将每个元组关联到一个整数标识符并提供它。在关系数据库中创建一个表并使用行号。
-
重要提示:仅当您希望它们分隔数据时,才应将列添加到您的标识符中。在上面输入的内容中,您似乎是在说两个不同位置的同一个客户应该被视为不同的客户。确保这是你想要的。
-
是的,我希望将不同位置的同一客户视为不同。那么,如果我将每个客户行映射到一个标识符,那么我的推荐人会考虑他的具体信息吗?
-
是的,它会将它们视为不同的实体。另请注意,同样的推理也适用于项目
-
您可以使用 zipWithUniqueId 方法创建一个具有不同值参数(customerID,location,....)的索引 RDD,然后将索引用作用户而不是您的 Rating 对象。
标签: python apache-spark pyspark collaborative-filtering apache-spark-mllib