我有一个跨多个分区的大型spark数据集。
| userId|竞赛ID|点|
| --|--|--|
| User1|竞赛1| 10 |
| User2|竞赛1| 15 |
| User3|竞赛2| 8 |
| 用户4|竞赛4| 20 |
上面的数据是巨大的,并且是均匀分区的。所以Contest 1数据分布在多个分区上。由于每个比赛的行数有很大的偏差,我不能按ContestID重新分区。
我想创建另一个数据集,它包含说,每个比赛的前10名用户。即对于每个比赛,其中10名用户得分最高的点。
如何并行处理多个分区,并对每个分区接收到的前10个值进行合并排序。我想避免排序,并在这里使用最大堆算法。
1条答案
按热度按时间b1zrtrql1#
由于某些竞赛可能有大量的行,因此您不能按竞赛分组,收集(用户ID,点数)元组的列表并在最后选择10个最大的。
我们可以做的是定义一个
topK
Uplink(用户定义的聚合函数),它将在我们进行时聚合前K个元素,以避免创建具有太多行的分区。让我们考虑以下数据集:
然后,下面是Udash的代码及其用法: