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]]