我有一个rdd,我按一个字段重新分区
rdd = rdd.repartition( new Column("block_id"));
并将其保存到hdfs。
我希望如果有20个不同的block_id
,重新分区会生成20个新分区,每个分区持有不同的block_id
。
但实际上在重新分区之后有19个分区,每个分区只有一个block_id
和一个分区,其中包含两个block_id
。
这意味着将具有两个block_id
的分区写入磁盘的核心与其他核心相比花费了两倍的时间,从而使整个时间加倍。
答案 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?