PySpark-SQL查询返回错误的数据
我正在研究协作过滤的实现(使用Movielens 20m数据集) 评级数据如下所示:PySpark-SQL查询返回错误的数据,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我正在研究协作过滤的实现(使用Movielens 20m数据集) 评级数据如下所示: | userId | movieId | rating | timestamp | 收视率在1-5之间(如果用户未对电影进行评分,则该电影不会出现在表中) 以下是守则的一部分: ratings = spark.read.option("inferSchema","true").option("header","true").csv("ratings.csv") ratings.createOrRepla
| 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数据集,没有重复项,即每个用户最多为每部电影评级一次
不确定这里缺少了什么。请尝试以下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
""")
不确定这是否是您想要的,但您的屏幕截图仅显示两列。我猜你想要的是:对于电影ID,如果用户没有提供评级,那么就放0,否则接受评级。如果是这种情况,您应该使用where子句筛选moveId。谢谢您的回复。你说得对,这就是我需要的。但是,您给出的查询正在筛选出对movieId==1没有评分的用户。它只给用户提供了电影的实际收视率。我还需要评级为0的其他用户。