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 相等的情况。
我有一个 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 相等的情况。