从PySpark Dataframe查找最大评级

时间:2019-03-10 04:56:16

标签: python dataframe lambda pyspark

我有一个类型为pyspark.sql.dataframe.DataFrame的数据框(user_recsDataFrame[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 *。 (评分也要包含在数据框中。

1 个答案:

答案 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')