在RD中严格将RDD划分为多个RDD

时间:2016-03-05 00:26:37

标签: apache-spark rdd

我有一个带有n分区的rdd,我想将此rdd拆分为k rdds,以便

rdd = rdd_1.union(rdd_2).union(rdd_3)...union(rdd_k)

例如,如果n=10k=2我希望得到2个rdds,其中rdd1由5个分区组成,rdd2由其他5个分区组成。

在Spark中执行此操作的最有效方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

val rdd: RDD[T] = ???
val k: Integer = ???
val n = rdd.partitions.size

val rdds = (0 until n) // Create Seq of partitions numbers
  .grouped(n / k)  // group it into fixed sized buckets
  .map(idxs => (idxs.head, idxs.last)) // Take the first and the last idx
  .map {
    case(min, max) => rdd.mapPartitionsWithIndex(
      // If partition in [min, max] range keep its iterator
      // otherwise return empty-one
      (i, iter) => if (i >= min & i <= max) iter else Iterator()
    )
  }

如果输入RDD具有复杂的依赖关系,则应在应用之前对其进行缓存。