Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PySpark-SQL查询返回错误的数据_Pyspark_Pyspark Sql - Fatal编程技术网

PySpark-SQL查询返回错误的数据

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

我正在研究协作过滤的实现(使用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数据集,没有重复项,即每个用户最多为每部电影评级一次

不确定这里缺少了什么。

请尝试以下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的其他用户。