如果增加分区,RDD分区似乎不会改组?

时间:2019-04-23 14:28:57

标签: apache-spark pyspark rdd partition

Spark v2.4

spark.range(5, numPartitions=1).rdd.keys().repartition(7).glom().collect()
# [[], [], [], [], [], [], [0, 1, 2, 3, 4]]

# 2 partitions initially
spark.range(5, numPartitions=2).rdd.keys().glom().collect()
# [[0, 1], [2, 3, 4]]

spark.range(5, numPartitions=2).rdd.keys().repartition(7).glom().collect()
# [[], [], [2, 3, 4], [], [], [], [0, 1]]

似乎仅在这种情况下才添加空分区?

但是,使用RoundRobinPartitioning,DataFrame分区确实可以正常工作。

spark.range(5, numPartitions=1).repartition(7).rdd.keys().glom().collect()
# [[0], [2], [4], [1], [], [], [3]]

spark.range(5, numPartitions=2).rdd.keys().glom().collect()
# [[0, 1], [2, 3, 4]]
spark.range(5, numPartitions=2).repartition(7).rdd.keys().glom().collect()
# [[1, 4], [], [], [], [], [3], [0, 2]]

RDD repartition使用哪些分区方法?

更新

@ user10938362使我遇到一个类似的问题,在其中我找到了可以回答我问题的答复。

由@ user11400142回答

之所以会发生这种情况,是因为Spark不会对单个元素进行混洗,而是对数据块with minimum batch size equal to 10进行混洗。

因此,如果您的元素少于每个分区的元素,Spark将不会分隔分区的内容。

示例

spark.range(10, numPartitions=1).rdd.keys().repartition(3).glom().collect()
# [[], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], []]
spark.range(11, numPartitions=1).rdd.keys().repartition(3).glom().collect()
# [[], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10]]

0 个答案:

没有答案