繁体   English   中英

在pyspark中的列上重新分区如何影响分区数量?

[英]How does repartitioning on a column in pyspark affect the number of partitions?

我有一个具有一百万条记录的数据框。 看起来像这样-

df.show()

+--------------------+--------------------++-------------
|            feature1|            feature2| domain    |
+--------------------+--------------------++-------------
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   | 
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain2   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain2   |
|[2.23668528E8, 1....|[2.23668528E8, 1....| domain1   |

理想的分区大小为128 MB,假设domain列具有两个唯一值(domain1和domain2),考虑到这一点,我有两个问题-

  1. 如果我执行df.repartition("domain") ,并且一个分区不能容纳特定域密钥的所有数据,那么应用程序会失败还是会根据数据自动创建合适的分区?

  2. 假设在上面的数据中已经基于域密钥进行了重新分区,所以将存在两个分区(唯一的密钥是domain1和domain2)。 现在,假设domain1和domain2重复了1000000次,我将基于该域进行自联接。 因此,对于每个域,我将获得大约10 ^ 12条记录。 考虑到我们有两个分区,并且在连接期间分区的数量没有变化,两个新分区是否能够处理1000000条记录?

答案取决于数据的大小。 当一个分区不能保存属于一个分区值的所有数据(例如domain1 )时,将创建更多分区,最多spark.sql.shuffle.partitions个分区。 如果您的数据太大,即一个分区将超过2GB的限制(有关说明,另请参见为什么Spark RDD分区HDFS的限制为2GB? ),重新分区将导致OutOfMemoryError
正如提供完整答案的旁注所示:能够将数据放入一个分区不一定意味着一个分区值只生成一个分区。 除其他因素外,这取决于执行程序的数量以及之前如何对数据进行分区。 Spark将尝试避免不必要的改组,因此可能会为一个分区值生成多个分区。

因此,为防止作业失败,您应该调整spark.sql.shuffle.partitions或将所需数量的分区与partition列一起进行repartition分区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM