我正在从文件中读取附加了ID的元素,并将其放入RDD中。然后,我将该RDD划分为多个部分,这些部分等于我发现的不同键的数量。每个键代表分区号:
[(k1, v1), (k2, v2), (k3, v3), (k1, v4), (k1, v5), (k1, v6)]
-> 3个不同的键,然后是3个分区:分区1有4个元素,分区2和3有1个元素。
数据分布不均,因此我想设置一个阈值来指示何时必须将数据发送到另一个分区,例如treshold = 3,则分区1最多可以包含3个元素,因此一个元素必须发送到另一个分区。我该如何实现?
我想避免完全重新分区,因为在我的应用程序中,具有相同键的元素必须属于同一分区,这一点很重要。但是,某些键非常频繁,而另一些则很少。这些严重不平衡的分区并不方便。
这就是我的分区方式
val partitionedRDD = rdd.partitionBy(new PointPartitioner(
rdd.keys.distinct().count().asInstanceOf[Int]))
这是PoinPartitioner类
class PointPartitioner(numParts: Int) extends org.apache.spark.Partitioner{
import org.apache.spark.Partitioner
override def numPartitions: Int = numParts
override def getPartition(key: Any): Int = {
key.hashCode % numPartitions
}
override def equals(other: Any): Boolean = other match
{
case dnp: PointPartitioner =>
dnp.numPartitions == numPartitions
case _ =>
false
}
}