Dataframe 建议-创建具有条件的新数据帧

Dataframe 建议-创建具有条件的新数据帧,dataframe,apache-spark,recommendation-engine,Dataframe,Apache Spark,Recommendation Engine,我研究Spark已经有一段时间了,但今天我陷入了困境,我在使用Audioscrobbler数据集的推荐模型中工作 我的模型以ALS为基础,并根据以下定义提出建议: def-makeRecommendations(model:ALSModel,userID:Int,howmount:Int):数据帧={ val toreRecommend=model.itemFactors.select($“id”.as(“artist”)).withColumn(“user”,lit(userID)) mode

我研究Spark已经有一段时间了,但今天我陷入了困境,我在使用Audioscrobbler数据集的推荐模型中工作

我的模型以ALS为基础,并根据以下定义提出建议:

def-makeRecommendations(model:ALSModel,userID:Int,howmount:Int):数据帧={
val toreRecommend=model.itemFactors.select($“id”.as(“artist”)).withColumn(“user”,lit(userID))
model.transform(转换)。
选择(“艺术家”、“预测”、“用户”)。
orderBy($“prediction”.desc)。
限制(数量)
}
它正在生成预期的输出,但现在我想使用预测DF和用户数据DF创建一个新的数据帧列表

新的DF列表包含来自“预测DF”和“已听”的预测值,如果用户未听艺术家的话,该值将为0,如果用户听了,则为1,类似于这样:

我尝试了以下解决方案:

val recommendationsSeq=someUsers.map{userID=>
//从testData中的用户获取艺术家
val artistsOfUser=testData.where($“user”。==(userID)).select(“artist”).rdd.map(r=>r(0)).collect.toList
//对每个用户的建议
val recoms=makeRecommendations(模型、用户ID、numRecom)
//插入一列,如果用户的测试集中有艺术家,则为1,否则为0
val recompoutput=recoms.withColumn(“listed”,when($“artist”).isin(artistsOfUser:*),1.0。否则(0.0)).drop(“artist”)
(输出)
}托塞克先生
但是,当推荐有30多个用户时,它非常耗时。我相信有更好的方法

有人能给点主意吗


谢谢,

您可以尝试加入数据帧,然后goupby和count:

scala> val df1 = Seq((1205,0.9873411,1000019)).toDF("artist","prediction","user")
scala> df1.show()
+------+----------+-------+
|artist|prediction|   user|
+------+----------+-------+
|  1205| 0.9873411|1000019|
+------+----------+-------+

scala> val df2 = Seq((1000019,1205,40)).toDF("user","artist","playcount")
scala> df2.show()
+-------+------+---------+
|   user|artist|playcount|
+-------+------+---------+
|1000019|  1205|       40|
+-------+------+---------+

scala> df1.join(df2,Seq("artist","user")).groupBy('prediction).count().show()
+----------+-----+
|prediction|count|
+----------+-----+
| 0.9873411|    1|
+----------+-----+