2015-05-19 2 views
2

Я пытаюсь использовать длинный идентификатор пользователя/продукта в модели ALS в PySpark MLlib (1.3.1) и столкнулся с проблемой. Упрощенная версия кода приводится здесь:Как использовать длинный идентификатор пользователя в PySpark ALS

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) 

Выполнение этого кода дает java.lang.ClassCastException, поскольку код пытается преобразовать длинные позиции в целых числах. Просматривая исходный код, ml ALS class в Spark допускает длинные идентификаторы пользователя/продукта, но затем mllib ALS class заставляет использовать ints.

Вопрос: Существует ли временное решение для использования длинных идентификаторов пользователей/продуктов в PySpark ALS?

ответ

3

Это известная проблема (https://issues.apache.org/jira/browse/SPARK-2465), но она не будет решена в ближайшее время, потому что изменение интерфейса к longIndId должно привести к замедлению вычислений.

Есть несколько решений:

  • вы можете хэш USERID в целое с хэш-функции(), так как это может вызвать только случайное сжатие строк в некоторых случаях столкновение не должно влиять на точность вашего рекомендателя, на самом деле , Обсуждение в первой ссылке.

  • вы можете создать уникальный Int UserIds с RDD.zipWithUniqueId() или менее быстрой RDD.zipWithIndex, так же, как в этой теме: How to assign unique contiguous numbers to elements in a Spark RDD

Смежные вопросы