加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何为相同大小的分区的Spark RDD定义自定义分区,其中

发布时间:2020-12-16 09:32:45 所属栏目:安全 来源:网络整理
导读:我是Spark的新手我有一个大的元素数据集[RDD],我想把它分成两个完全相同的大小的分区,维护元素的顺序。我尝试使用RangePartitioner var data = partitionedFile.partitionBy(new RangePartitioner(2,partitionedFile)) 这并没有给出令人满意的结果,因为它
我是Spark的新手我有一个大的元素数据集[RDD],我想把它分成两个完全相同的大小的分区,维护元素的顺序。我尝试使用RangePartitioner

var data = partitionedFile.partitionBy(new RangePartitioner(2,partitionedFile))

这并没有给出令人满意的结果,因为它分割大致但并不完全相同的维数维度。
例如,如果有64个元素,我们使用
然后,它分为31个元素和33个元素。

我需要一个分区器,这样我就可以得到一半的前32个元素,另外一半包含第二组32个元素。
可以帮助我,建议如何使用自定义的分割器,使我平均大小两半,维持元素的顺序?

解决方法

分区工作通过分配一个键到一个分区。您需要事先知道密钥分发,或查看所有密钥,才能使这样的分割器。这就是为什么Spark不提供一个。

一般来说,您不需要这样的分区器。实际上我不能想出一个需要等尺寸分区的用例。如果元素的数量是奇数怎么办?

无论如何,让我们说你有一个按顺序Ints键入的RDD,你知道总共有多少。那么你可以这样写一个自定义的分区器:

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
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读