将RDD划分为每个分区中元素数量固定的分区

Posted

技术标签:

【中文标题】将RDD划分为每个分区中元素数量固定的分区【英文标题】:Divide the RDD into partitions with fixed number of elements in each partition 【发布时间】:2017-04-01 18:48:01 【问题描述】:

在 Apache Spark 中,

repartition(n) - 允许将 RDD 完全划分为 n 分区。

但是如何将给定的 RDD 划分为多个分区,以使所有分区(最后一个分区除外)都具有指定数量的元素。鉴于 RDD 中的元素数量未知,并且执行 .count() 的成本很高。

C = sc.parallelize([x for x in range(10)],2)
Let's say internally,  C = [[0,1,2,3,4,5], [6,7,8,9]]  
C = someCode(3)

预期:

C = [[0,1,2], [3,4,5], [6, 7, 8], [9]]

【问题讨论】:

【参考方案1】:

在 pyspark 中很容易:

    C = sc.parallelize([x for x in range(10)],2)
    rdd = C.map(lambda x : (x, x))
    C_repartitioned = rdd.partitionBy(4,lambda x: int( x *4/11)).map(lambda x: x[0]).glom().collect()
    C_repartitioned

    [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

这称为自定义分区。 更多信息:http://sparkdatasourceapi.blogspot.ru/2016/10/patitioning-in-spark-writing-custom.html

http://baahu.in/spark-custom-partitioner-java-example/

【讨论】:

以上是关于将RDD划分为每个分区中元素数量固定的分区的主要内容,如果未能解决你的问题,请参考以下文章

spark 中划分stage的思路

Spark(10)——Spark的Stage如何划分

PySpark 重新分区 RDD 元素

Spark中将一个RDD严格划分为多个RDD

Spark中repartition和coalesce的用法

什么是 Spark RDD ?