Spark重新分区不会均匀分配记录

时间:2017-07-30 14:25:22

标签: apache-spark dataset rdd

我有一个rdd,我按一个字段重新分区

   rdd = rdd.repartition( new Column("block_id"));

并将其保存到hdfs。

我希望如果有20个不同的block_id,重新分区会生成20个新分区,每个分区持有不同的block_id。 但实际上在重新分区之后有19个分区,每个分区只有一个block_id和一个分区,其中包含两个block_id。 这意味着将具有两个block_id的分区写入磁盘的核心与其他核心相比花费了两倍的时间,从而使整个时间加倍。

1 个答案:

答案 0 :(得分:1)

Spark Dataset使用散列分区。我们无法保证不会有hash colisions因此您无法预料:

  

如果有20个不同的block_id,则重新分区将生成20个新分区,每个分区持有不同的block_id

您可以尝试增加分区数量,但使用提供良好保证的数字是不切实际的。

使用RDD,您可以设计自己的分区How to Define Custom partitioner for Spark RDDs of equally sized partition where each partition has equal number of elements?