我是Spark的新手。我有一个很大的elementsRDD数据集,我想把它分成两个大小完全相等的分区,以保持元素的顺序。我试着像这样使用RangePartitioner
var data = partitionedFile.partitionBy(new RangePartitioner(2, partitionedFile))
这不会给出一个令人满意的结果,因为它粗略地划分了元素的大小,但不是完全相等,从而保持了元素的顺序。例如,如果有64个元素,我们使用Rangepartitioner
,那么它分为31个元素和33个元素。
我需要一个分割器,这样我就可以得到前32个元素在一半和另一半包含第二组32个元素。你能帮我建议如何使用一个自定义的分割器,这样我就可以得到大小相等的两半,保持元素的顺序吗?
发布于 2014-04-23 03:07:05
Partitioner
的工作方式是给分区分配一个键。您需要了解密钥分布的先验知识,或者查看所有密钥,才能创建这样的分区程序。这就是为什么Spark没有为你提供一个。
一般来说,您不需要这样的分区程序。事实上,我想不出一个需要大小相等的分区的用例。如果元素的数量是奇数怎么办?
不管怎样,假设你有一个以顺序Int
为关键字的RDD,你知道总共有多少。然后,您可以像这样编写一个自定义Partitioner
:
class ExactPartitioner[V](
partitions: Int,
elements: Int)
extends Partitioner {
def getPartition(key: Any): Int = {
val k = key.asInstanceOf[Int]
// `k` is assumed to go continuously from 0 to elements-1.
return k * partitions / elements
}
}
https://stackoverflow.com/questions/23127329
复制相似问题