转换后保留Spark数据帧的分区数

时间:2017-09-12 17:21:10

标签: apache-spark apache-spark-sql partitioning data-partitioning

我正在查看代码中的一个错误,其中数据框被分割成太多分区而不是所需的分区(超过700),当我尝试将它们重新分区到48时,这会导致太多的随机操作。我不能在这里使用coalesce()因为我想在进行重新分区之前首先拥有更少的分区。

我正在寻找减少分区数量的方法。假设我有一个火花数据帧(有多列),分为10个分区。我需要根据其中一个列进行orderBy转换。完成此操作后,结果数据帧是否具有相同数量的分区?如果没有,那么如何决定分区的数量呢?

除了像repartition()之类的明显变化之外,还有哪些其他转换可能导致数据帧的分区数量发生变化,我需要注意这些变换?

1 个答案:

答案 0 :(得分:2)

需要交换的操作的分区数由spark.sql.shuffle.partitions定义。如果你想要一个特定的值,你应该在执行命令之前设置它:

scala> val df = spark.range(0, 1000)
df: org.apache.spark.sql.Dataset[Long] = [id: bigint]

scala> spark.conf.set("spark.sql.shuffle.partitions", 1)

scala> df.orderBy("id").rdd.getNumPartitions
res1: Int = 1

scala> spark.conf.set("spark.sql.shuffle.partitions", 42)

scala> df.orderBy("id").rdd.getNumPartitions
res3: Int = 42