spark.sql.shuffle.partitions和df.repartition之间的区别(如果有)

时间:2018-06-20 17:59:57

标签: apache-spark pyspark apache-spark-sql

我在调解sqlContext.sql("set spark.sql.shuffle.partitions=n")之间的差异(如果存在)和使用df.repartition(n)重新划分Spark DataFrame方面遇到一些困难。

Spark文档表明set spark.sql.shuffle.partitions=n配置了在对数据进行混排时使用的分区数,而df.repartition似乎返回了一个按指定键数划分的新DataFrame。

为使这个问题更清楚,这是一个玩具示例,说明我我相信df.reparitionspark.sql.shuffle.partitions如何工作:

假设我们有一个DataFrame,如下所示:

ID | Val
--------
A  |  1
A  |  2
A  |  5
A  |  7
B  |  9
B  |  3
C  |  2
  1. 方案1:3个随机分区,按ID分配DF : 如果我先设置sqlContext.sql("set spark.sql.shuffle.partitions=3"),然后再进行df.repartition($"ID"),我希望将数据重新分区为3个分区,其中一个分区保存ID为“ A”的所有行的3个值,另一个保存2个值。所有ID为“ B”的行的val,最后一个分区为ID为“ C”的所有行的val。
  2. 方案2:5个混洗分区,按ID进行重定位DF :在这种情况下,我仍然仍然希望每个分区仅保留带有相同ID标记的数据。也就是说,在同一分区内不会混合使用具有不同ID的行

我的理解在这里吗?一般来说,我的问题是:

  1. 我正在尝试优化数据帧的分区,以避免 倾斜,但要使每个分区都拥有相同的键 尽可能的信息。如何使用set spark.sql.shuffle.partitionsdf.repartiton来实现?

  2. 是否存在链接 在set spark.sql.shuffle.partitionsdf.repartition之间?如果 那么,那是什么链接?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

我希望将数据重新划分为3个分区,其中一个分区保存ID为“ A”的所有行的3个值,另一个分区保存ID为“ B”的所有行的2个值,最后一个分区保存ID为“ C”的所有行中有1个值。

  

5个混洗分区,按ID排序DF:在这种情况下,我仍然希望每个分区仅保存标记有相同ID的数据。也就是说,在同一分区内不会混合使用具有不同ID的行。

没有。

这不是分区的工作方式。 Partitioners将值映射到分区,但是一般情况下映射不是唯一的(您可以查看How does HashPartitioner work?以获得详细说明)。

  

set spark.sql.shuffle.partitions和df.repartition之间是否存在链接?如果是这样,那是什么链接?

确实存在。如果您df.repartition,但未提供分区数,则使用spark.sql.shuffle.partitions