【问题标题】:Preserving the number of partitions of a Spark dataframe after transformation转换后保留 Spark 数据帧的分区数
【发布时间】:2018-02-21 06:17:27
【问题描述】:
我正在查看代码中的一个错误,其中数据帧被分成了比预期多的分区(超过 700 个),当我尝试将它们重新分区为 48 时,这会导致过多的随机播放操作。我不能在这里使用 coalesce() 是因为我希望在进行重新分区之前首先拥有更少的分区。
我正在寻找减少分区数量的方法。假设我有一个分为 10 个分区的 spark 数据框(具有多列)。我需要根据其中一列进行 orderBy 转换。完成此操作后,生成的数据帧是否会具有相同数量的分区?如果没有,spark 将如何决定分区的数量?
除了像 repartition() 这样明显的转换之外,我还需要注意哪些其他转换可能会导致数据帧的分区数量发生变化?
【问题讨论】:
标签:
apache-spark
apache-spark-sql
partitioning
data-partitioning
【解决方案1】:
需要交换的操作的分区数由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