为什么Spark的重新分区没有平衡数据到分区?

问题描述 投票:2回答:3
>>> rdd = sc.parallelize(range(10), 2)
>>> rdd.glom().collect()
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>> rdd.repartition(3).glom().collect()
[[], [0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]
>>>

第一个分区是空的?为什么?我真的很感谢你告诉我原因。

apache-spark pyspark rdd
3个回答
2
投票

之所以发生这种情况,是因为Spark并没有改变个别元素,而是数据块 - with minimum batch size equal to 10

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


1
投票

这可以通过查看重新分区功能的工作原理来解释。这样做的原因是调用df.repartition(COL, numPartitions=k)将使用基于散列的分区创建具有k分区的数据帧。 Pyspark将遍历每一行并应用以下function来确定当前行中元素的结束位置:

partition_the_row_belongs_to = hash(COL) % k

在这种情况下,k用于将行映射到由k个分区组成的空间。如您所见,有时哈希函数会发生冲突。有时一些分区将是空的,而其他分区则有太多元素。这可能是因为哈希映射的结论,或者是因为哈希函数。无论哪种方式,您所看到的原因是重新分区按照您的要求创建了3个分区,它不会向您提供有关平衡分区或让所有分区非空的任何信息。如果您想更好地控制生成的分区的外观,请查看partitionby

另见:this questionthis question

我希望有所帮助。


0
投票

值得一提的是,由于Spark只是大规模运行,因此不太可能担心这种情况。您可以获得的最接近的数据是偏差数据。 range将提供与将使用散列的重新分区不同的初始分区。批量大小的评论也是有效的,但在实践中不太相关。

© www.soinside.com 2019 - 2024. All rights reserved.