使用Spark在RDD的每个分区中使用固定的最小元素数进行分区

时间:2019-05-30 10:44:53

标签: scala apache-spark rdd

我有一个RDD,每个分区中的元素数量如下(分区总数为val numPart = 32

  

1351,962,537,250,80,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0、15、88、270、635、1028、1388、1509

要查看先前的输出,请使用以下代码:

def countByPartition[A](anRdd: RDD[A]): RDD[Int] = anRdd.mapPartitions(iter => Iterator(iter.length))

println(countByPartition(anRdd).collect.mkString(", "))

我希望每个分区上至少有val min = 5给出的最小数量的元素。

我尝试执行anRdd.repartition(numPart)并且得到以下信息:

  

257、256、256、256、255、255、254、253、252、252、252、252、252、252,   252、252、251、250、249、248、248、248、248、248、261、261、260、260,   259、258、258、257

在这种情况下,这是完美的,因为在每个分区中,我有超过min个元素。但这并不总是相同,有时我会得到一些分区,分区的值小于min值。

有没有办法做我想做的事?

1 个答案:

答案 0 :(得分:2)

这是不可能的,通常您需要选择分区,以使大小大致均匀。 Spark中的Partitioners基本实现了两种方法numPartitionsgetPartition。后者是从单个键到分区号的功能,因此此时尚不知道其他元素以及分区的潜在大小。