我有一张地图的RDD,其中地图肯定有交叉的密钥集。每张地图可能有10,000个条目。
我需要合并地图,以便合并具有相交键集的地图,但其他地方则保持不同。
这就是我所拥有的。我没有测试它是否有效,但我知道它是慢。
def mergeOverlapping(maps: RDD[Map[Int, Int]])(implicit sc: SparkContext): RDD[Map[Int, Int]] = {
val in: RDD[List[Map[Int, Int]]] = maps.map(List(_))
val z = List.empty[Map[Int, Int]]
val t: List[Map[Int, Int]] = in.fold(z) { case (l, r) =>
(l ::: r).foldLeft(List.empty[Map[Int, Int]]) { case (acc, next) =>
val (overlapping, distinct) = acc.partition(_.keys.exists(next.contains))
overlapping match {
case Nil => next :: acc
case xs => (next :: xs).reduceLeft(merge) :: distinct
}
}
}
sc.parallelize(t)
}
def merge(l: Map[Int, Int], r: Map[Int, Int]): Map[Int, Int] = {
val keys = l.keySet ++ r.keySet
keys.map { k =>
(l.get(k), r.get(k)) match {
case (Some(i), Some(j)) => k -> math.min(i, j)
case (a, b) => k -> (a orElse b).get
}
}.toMap
}
据我所知,问题是RDD#fold
正在合并和重新合并地图的次数比它要多得多。
我可以使用更有效的机制吗?有没有其他方法可以构建我的数据以使其有效?