通过合并地图

时间:2016-04-07 00:15:58

标签: scala apache-spark

我有一张地图的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正在合并和重新合并地图的次数比它要多得多。

我可以使用更有效的机制吗?有没有其他方法可以构建我的数据以使其有效?

0 个答案:

没有答案