Python 在pyspark中对列进行重新分区如何影响分区数?

Python 在pyspark中对列进行重新分区如何影响分区数?,python,apache-spark,pyspark,apache-spark-sql,partition,Python,Apache Spark,Pyspark,Apache Spark Sql,Partition,我有一个有一百万条记录的数据框。看起来像这样- df.show() +--------------------+--------------------++------------- | feature1| feature2| domain | +--------------------+--------------------++------------- |[2.23668528E8, 1....|[2.23668528E8, 1....|

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

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   |
在spark中,理想的分区大小是128MB,让我们假设domain列有两个唯一的值(domain1和domain2),考虑到这一点,我有两个问题-

  • 如果我进行了
    df.repartition(“domain”)
    并且如果一个分区不能容纳特定域密钥的所有数据,应用程序是否会失败,或者根据数据自动创建适合的分区

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


  • 答案取决于数据的大小。当一个分区不能保存属于一个分区值的所有数据时(例如
    domain1
    ),将创建更多的分区,最多
    spark.sql.shuffle.partitions
    多个。如果您的数据太大,即一个分区将超过2GB的限制(有关此限制的解释,请参见),则重新分区将导致OutOfMemoryError。
    正如提供完整答案的旁注:能够将数据放入一个分区并不一定意味着一个分区值只生成一个分区。这取决于执行者的数量以及之前数据的分区方式。Spark将尝试避免不必要的洗牌,因此可以为一个分区值生成多个分区

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