首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何为大小相等的Spark RDDs定义自定义分区,其中每个分区具有相同数量的元素?

如何为大小相等的Spark RDDs定义自定义分区,其中每个分区具有相同数量的元素?
EN

Stack Overflow用户
提问于 2014-04-17 15:41:10
回答 1查看 47.7K关注 0票数 29

我是Spark的新手。我有一个很大的elementsRDD数据集,我想把它分成两个大小完全相等的分区,以保持元素的顺序。我试着像这样使用RangePartitioner

代码语言:javascript
复制
var data = partitionedFile.partitionBy(new RangePartitioner(2, partitionedFile))

这不会给出一个令人满意的结果,因为它粗略地划分了元素的大小,但不是完全相等,从而保持了元素的顺序。例如,如果有64个元素,我们使用Rangepartitioner,那么它分为31个元素和33个元素。

我需要一个分割器,这样我就可以得到前32个元素在一半和另一半包含第二组32个元素。你能帮我建议如何使用一个自定义的分割器,这样我就可以得到大小相等的两半,保持元素的顺序吗?

EN

回答 1

Stack Overflow用户

发布于 2014-04-23 03:07:05

Partitioner的工作方式是给分区分配一个键。您需要了解密钥分布的先验知识,或者查看所有密钥,才能创建这样的分区程序。这就是为什么Spark没有为你提供一个。

一般来说,您不需要这样的分区程序。事实上,我想不出一个需要大小相等的分区的用例。如果元素的数量是奇数怎么办?

不管怎样,假设你有一个以顺序Int为关键字的RDD,你知道总共有多少。然后,您可以像这样编写一个自定义Partitioner

代码语言:javascript
复制
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
  }
}
票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23127329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档