如何在Spark中均匀重新分配?

时间:2016-06-29 14:04:24

标签: apache-spark pyspark

为了测试.repartition()的工作原理,我运行了以下代码:

rdd = sc.parallelize(range(100))
rdd.getNumPartitions()

rdd.getNumPartitions()导致4。然后我跑了:

rdd = rdd.repartition(10)
rdd.getNumPartitions()

rdd.getNumPartitions()这次导致10,因此现在有10个分区。

但是,我通过以下方式检查了分区:

rdd.glom().collect()

结果给出了4个非空列表和6个空列表。为什么没有任何元素被分发到其他6个列表?

1 个答案:

答案 0 :(得分:2)

repartition()背后的算法使用逻辑来优化跨分区重新分配数据的最有效方法。在这种情况下,您的范围非常小,并且它没有找到最佳实际打破数据的最佳选择。如果您使用更大的范围(如100000),您会发现它确实会重新分配数据。

如果要强制执行一定数量的分区,可以在初始加载数据时指定分区数。此时,它将尝试在分区之间均匀分布数据,即使它不一定是最佳的。 parallelize函数为分区

采用第二个参数
    rdd = sc.parallelize(range(100), 10)

如果您要从文本文件中读取

,同样的事情会有效
    rdd = sc.textFile('path/to/file/, numPartitions)