【问题标题】:Find maximum rating from PySpark Dataframe从 PySpark Dataframe 中查找最高评分
【发布时间】:2019-03-10 04:56:15
【问题描述】:

我有一个 DataFrame[user: int, recommendations: array<struct<item:int,rating:float>>] 类型的数据框 (pyspark.sql.dataframe.DataFrame)user_recs

我想为每个用户选择最好的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*。 (评级也将包含在数据框中。

【问题讨论】:

    标签: python dataframe lambda pyspark


    【解决方案1】:

    一种方法是使用 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')
    

    【讨论】:

    • 我收到此错误AssertionError: col should be Column for result
    • 你会想要类似:col('top_rated_item'),对不起。
    • 实际上,我倒过来了,因为我传递了函数top_rating_udf,但没有给它任何输入列。我刚刚编辑了我的答案来解决这个问题。
    • 对于该行:result.select('user', 'top_rated_item.item', 'top_rated_item.rating') 评级不是结构类型:Can't extract value from top_rated_item#19022: need struct type but got string;
    • 新列top_rated_itemresult 中是否正确?我只是想在我们对选择进行故障排除之前确定一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2021-01-18
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多