为了测试.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个列表?
答案 0 :(得分:2)
repartition()背后的算法使用逻辑来优化跨分区重新分配数据的最有效方法。在这种情况下,您的范围非常小,并且它没有找到最佳实际打破数据的最佳选择。如果您使用更大的范围(如100000),您会发现它确实会重新分配数据。
如果要强制执行一定数量的分区,可以在初始加载数据时指定分区数。此时,它将尝试在分区之间均匀分布数据,即使它不一定是最佳的。 parallelize函数为分区
采用第二个参数 rdd = sc.parallelize(range(100), 10)
如果您要从文本文件中读取
,同样的事情会有效 rdd = sc.textFile('path/to/file/, numPartitions)