Spark 获取每个(item1,item2,score)的前 N ​​个最高分结果

Posted

技术标签:

【中文标题】Spark 获取每个(item1,item2,score)的前 N ​​个最高分结果【英文标题】:Spark get top N highest score results for each (item1, item2, score) 【发布时间】:2018-03-09 19:06:10 【问题描述】:

我有一个以下格式的 DataFrame

item_id1: Long, item_id2: Long, similarity_score: Double

我想要做的是为每个 item_id1 获取前 N 个最高相似性_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对记录进行分组,再按score逆序排序,再限制结果。但我不知道如何在 Spark Scala 中实现它。

谢谢。

【问题讨论】:

【参考方案1】:

我建议为此使用窗口函数:

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

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

【讨论】:

谢谢!这正是我一直在寻找的。需要在 Window 上阅读更多内容。

以上是关于Spark 获取每个(item1,item2,score)的前 N ​​个最高分结果的主要内容,如果未能解决你的问题,请参考以下文章

数组具有格式为“item1,item2”的值。我希望它是 ["item1","item2"]。我该怎么办?

Lambda 表达式,比较 item1,如果它们相等,比较 item2

从json对象数组中提取元素

grid - 网格项目层级

在 django 中将 JSON 显示为模板列表

解析XML列表c#