PySpark - SQL-запрос возвращает неверные данные - PullRequest
0 голосов
/ 08 сентября 2018

Я работаю над внедрением совместной фильтрации (используя набор данных 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, дубликатов нет, то есть каждый пользователь оценил каждый фильм максимум один раз.

Не уверен, что мне здесь не хватает.

1 Ответ

0 голосов
/ 08 сентября 2018

Попробуйте следующий sql:

i_ratings = spark.sql("""
   select
     distinct userId,
     case when rating is not null then rating else 0 end as rating
   from ratings
   where movieId = 1
   order by userId asc
   """) 

Не уверен, что это то, что вы хотите, но ваш скриншот показывает только два столбца.Я предполагаю, что вы хотите следующее: для movieid, если пользователь не предоставил оценку, тогда поставьте 0, иначе оцените.Если это так, вы должны отфильтровать moveId, используя предложение where.

...