首页 >数据库 >mysql教程 >如何使用 Scala 检索 Spark SQL DataFrame 中每个用户组的前 N ​​个项目?

如何使用 Scala 检索 Spark SQL DataFrame 中每个用户组的前 N ​​个项目?

Linda Hamilton
Linda Hamilton原创
2024-12-22 04:58:17452浏览

How to Retrieve Top N Items per User Group in a Spark SQL DataFrame using Scala?

在 Spark SQL DataFrame 中为分组数据生成 TopN

问题:

给定一个包含代表用户的列的 Spark SQL DataFrame 、项目和用户评分,我们如何按用户分组,然后使用以下方法检索每个组的前 N ​​个项目Scala?

答案:

要实现这一点,我们可以利用排名窗口函数,如下所示:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.{rank, desc}

val n: Int = ???

// Define the window specification
val w = Window.partitionBy($"user").orderBy(desc("rating"))

// Calculate the rank for each item
val withRank = df.withColumn("rank", rank.over(w))

// Filter to retain only the top N items
val topNPerUser = withRank.where($"rank" <= n)

更多详细信息:

  • rank 函数将排名分配给每个用户组中的每个项目,评分最高的项目的排名为 1。
  • w 窗口规范通过按用户对 DataFrame 进行分区并按评分降序对数据进行排序来定义排名范围。
  • withRank DataFrame 现在包含一个“rank”列,可用于过滤。
  • topNPerUser DataFrame 仅包含前 N 个项目每个用户,根据他们的评分。

如果您更喜欢使用 row_number 函数,该函数分配连续的行号而不是排名(忽略关系),您可以在窗口定义中将排名替换为 row_number :

val w = Window.partitionBy($"user").orderBy(desc("rating"))

val withRowNumber = df.withColumn("row_number", row_number.over(w))

val topNPerUser = withRowNumber.where($"row_number" <= n)

以上是如何使用 Scala 检索 Spark SQL DataFrame 中每个用户组的前 N ​​个项目?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn