Spark为每个(item1,item2,score)获得前N个最高分结果

Spark get top N highest score results for each (item1, item2, score)

我有一个 DataFrame,格式如下:

item_id1: Long, item_id2: Long, similarity_score: Double

我想要做的是为每个 item_id1 获取前 N 个最高 similarity_score 记录。 所以,例如:

1 2 0.5
1 3 0.4
1 4 0.3
2 1 0.5
2 3 0.4
2 4 0.3

与前 2 个相似的项目将给予:

1 2 0.5
1 3 0.4
2 1 0.5
2 3 0.4

我隐约猜到可以先按item_id1对记录进行分组,然后按分数反向排序,然后限制结果。但是我对如何在 Spark Scala 中实现它感到困惑。

谢谢。

我建议为此使用 window-functions:

 df
  .withColumn("rnk",row_number().over(Window.partitionBy($"item_id1").orderBy($"similarity_score")))
  .where($"rank"<=2)

或者,您可以使用 dense_rank/rank 而不是 row_number,具体取决于如何处理 similarity-score 相等的情况。