我有一个类型为pyspark.sql.dataframe.DataFrame
的数据框(user_recs
)DataFrame[user: int, recommendations: array<struct<item:int,rating:float>>]
。
我想为每个用户选择最佳的rating
及其对应的item
。
例如,对于用户号471
,我有以下一行
user_recs.where(user_recs.user == 471).select("recommendations.item", "recommendations.rating").collect()
>>>[Row(item=[0, 23, 4], rating=[0.005226806737482548, 0.0044402251951396465, 0.004139747936278582])]
我希望结果为类似于user_recs
但具有最高评分的数据框。我希望item
的数字为0,因为它的最佳评价为0.005 *。 (评分也要包含在数据框中。
答案 0 :(得分:0)
一种方法是使用Spark的map
方法并进行排序以获得每个用户的最高评分。看起来像这样:
from pyspark.sql.functions import udf
def top_rating(s):
return sorted(s, lambda x: x.rating)[0]
top_rating_udf = udf(top_rating)
result = user_recs.withColumn('top_rated_item', top_rating_udf(col('recommendations'))
我还没有测试,但这应该很接近。注意,这实际上为您提供了一个带有结果的新列,因此,如果您不需要,则不必删除其他列。您还可以在自己的列中提取评分最高的商品和排名最高的商品:
result.select('user', 'top_rated_item.item', 'top_rated_item.rating')