在Scala Spark上,给定S和B的排序数据集,选择具有最低排名的S和B对,以确保每个S和每个B的唯一值。
样本输入:
|Rank|S |B |
|----|---|---|
| 1|S1 |B1 |
| 2|S2 |B1 |
| 3|S3 |B1 |
| 4|S1 |B2 |
| 5|S3 |B1 |
| 6|S2 |B2 |
样本输出:
|Rank|S |B |
|----|---|---|
| 1|S1 |B1 |
| 6|S2 |B2 |
我了解如何依次解决此问题,但是可以使用Spark解决吗?如果可以,怎么办?
答案 0 :(得分:1)
这只是部分解决方案,但是我认为,如果分区正确,则可以使用mapPartitions
来完成每个分区的工作。类似于以下内容:
val rdd: RDD[(Int, String, String)] = ...
rdd.mapPartitions { it =>
it.foldLeft(List.empty[(Int, String, String)]) {
case (Nil, e) => List(e)
case ((i, ci1, ci2) :: tail, (j, cj1, cj2)) =>
if (ci1 == cj1 || ci2 == cj2)
(i, ci1, ci2) :: tail
else
(j, cj1, cj2) :: (i, ci1, ci2) :: tail
}
}