Я работаю над внедрением совместной фильтрации (используя набор данных Movielens 20m).
данные рейтинга выглядят так:
| userId | movieId | rating | timestamp |
оценки находятся в диапазоне 1-5 (если пользователь не оценил фильм, его нет в таблице).
Следующее является частью кода:
ratings = spark.read.option("inferSchema","true").option("header","true").csv("ratings.csv")
ratings.createOrReplaceTempView("ratings")
ratings.createOrReplaceTempView("ratings")
i_ratings = spark.sql("select distinct userId, case when movieId == 1 then rating else 0 end as rating from ratings order by userId asc ")
SQL-запрос должен возвращать для movieId == 1 все оценки, которые он получает от пользователя, и 0 для пользователей, которые его не оценивали.
Я получаю следующее: фрейм данных
Как вы можете видеть, если пользователь не оценил фильм, я получаю оценку = 0, как хотелось бы, однако для пользователей, которые оценили фильм, я получаю две строки, одна с действительной оценкой, а другая с рейтингом = 0.
Проверен набор данных ratings.csv, дубликатов нет, то есть каждый пользователь оценил каждый фильм максимум один раз.
Не уверен, что мне здесь не хватает.