我有一个带有n
分区的rdd,我想将此rdd拆分为k
rdds,以便
rdd = rdd_1.union(rdd_2).union(rdd_3)...union(rdd_k)
例如,如果n=10
和k=2
我希望得到2个rdds,其中rdd1由5个分区组成,rdd2由其他5个分区组成。
在Spark中执行此操作的最有效方法是什么?
答案 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
具有复杂的依赖关系,则应在应用之前对其进行缓存。