Apache spark 在spark DF中使用partitionBy后是否可以进行重新分区?

Apache spark 在spark DF中使用partitionBy后是否可以进行重新分区?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我问这个问题是因为如果我将重新分区指定为5,那么我的所有数据(>200Gig)都会被移动到5个不同的执行器,98%的资源没有使用。然后,partitionBy正在发生,这再次造成了大量的混乱。有没有一种方法可以先执行分区,然后对数据执行重新分区?您可以使用重新分区(5,col($colName”) 因此,当您将分区为(“$colName”)时,您将跳过“$colName”的洗牌,因为它已经被重新分区 也考虑到使用的核数为3的执行器的乘积有多个分区(这可能在2和4之间变化)。 所以我们知道,Spa

我问这个问题是因为如果我将重新分区指定为5,那么我的所有数据(>200Gig)都会被移动到5个不同的执行器,98%的资源没有使用。然后,partitionBy正在发生,这再次造成了大量的混乱。有没有一种方法可以先执行分区,然后对数据执行重新分区?

您可以使用
重新分区(5,col($colName”)

因此,当您将
分区为(“$colName”)
时,您将跳过
“$colName”
的洗牌,因为它已经被重新分区

也考虑到使用的核数为3的执行器的乘积有多个分区(这可能在2和4之间变化)。 所以我们知道,Spark只能为RDD的每个分区运行一个并发任务。假设每个执行器有8个内核和5个执行器:


您需要有:8*5*3=120个分区

尽管这个问题并不完全容易理解,但以下内容与另一个答案一致,并且这种方法应该避免不必要的混乱中提到的问题:

val n = [... some calculation for number of partitions / executors based on cluster config and volume of data to process ...]

df.repartition(n, $"field_1", $"field_2", ...)
  .sortWithinPartitions("fieldx", "field_y")
  .write.partitionBy("field_1", "field_2", ...)
  .format("location")

其中[field_1,field_2,…]是用于重新分区和分区的同一组字段。

答案是否得到您的批准?