Jon*_*Jon 3 apache-spark pyspark apache-spark-mllib
我尝试在 PySpark MLlib (1.3.1) 的 ALS 模型中使用长用户/产品 ID,但遇到了问题。这里给出了代码的简化版本:
from pyspark import SparkContext
from pyspark.mllib.recommendation import ALS, Rating
sc = SparkContext("","test")
# Load and parse the data
d = [ "3661636574,1,1","3661636574,2,2","3661636574,3,3"]
data = sc.parallelize(d)
ratings = data.map(lambda l: l.split(',')).map(lambda l: Rating(long(l[0]), long(l[1]), float(l[2])) )
# Build the recommendation model using Alternating Least Squares
rank = 10
numIterations = 20
model = ALS.train(ratings, rank, numIterations)
Run Code Online (Sandbox Code Playgroud)
运行此代码会产生 a java.lang.ClassCastException
,因为该代码正在尝试将长整型转换为整数。查看源代码, Spark 中的ml ALS 类允许使用长用户/产品 ID,但mllib ALS 类强制使用整数。
问题:是否有解决方法可以在 PySpark ALS 中使用长用户/产品 ID?
小智 7
这是已知问题(https://issues.apache.org/jira/browse/SPARK-2465),但不会很快得到解决,因为将接口更改为长 userId 会减慢计算速度。
解决办法有以下几种:
您可以使用 hash() 函数将 userId 哈希为 int,因为它在少数情况下只会导致随机行压缩,因此冲突实际上不会影响推荐系统的准确性。第一个链接中的讨论。
您可以使用 RDD.zipWithUniqueId() 或速度较慢的 RDD.zipWithIndex 生成唯一的 int userId,就像在这个线程中一样:How to allocate unique contigious number to elements in a Spark RDD