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

csh*_*in9 7 apache-spark pyspark

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

rdd = sc.parallelize(range(100))
rdd.getNumPartitions()
Run Code Online (Sandbox Code Playgroud)

rdd.getNumPartitions()结果4.然后我跑了:

rdd = rdd.repartition(10)
rdd.getNumPartitions()
Run Code Online (Sandbox Code Playgroud)

rdd.getNumPartitions()这次导致了10,所以现在有10个分区.

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

rdd.glom().collect()
Run Code Online (Sandbox Code Playgroud)

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

use*_*181 4

repartition() 背后的算法使用逻辑来优化跨分区重新分配数据的最有效方法。在这种情况下,您的范围非常小,并且发现实际进一步分解数据并不是最佳选择。如果您使用更大的范围(例如 100000),您会发现它实际上重新分配了数据。

如果您想强制使用一定数量的分区,可以在初始加载数据时指定分区数量。此时,它将尝试跨分区均匀分布数据,即使这不一定是最佳的。并行化函数采用分区的第二个参数

    rdd = sc.parallelize(range(100), 10)
Run Code Online (Sandbox Code Playgroud)

如果你说从文本文件中读取,同样的事情也会起作用

    rdd = sc.textFile('path/to/file/, numPartitions)
Run Code Online (Sandbox Code Playgroud)