首頁 >資料庫 >mysql教程 >如何使用 Scala 檢索 Spark SQL DataFrame 中每個使用者群組的前 N ​​個專案?

如何使用 Scala 檢索 Spark SQL DataFrame 中每個使用者群組的前 N ​​個專案?

Linda Hamilton
Linda Hamilton原創
2024-12-22 04:58:17476瀏覽

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