首页 > 解决方案 > spark.sql.shuffle.partitions 和 df.repartition 之间的区别(如果有的话)

问题描述

我在调和sqlContext.sql("set spark.sql.shuffle.partitions=n")使用df.repartition(n).

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 个 Shuffle Partitions,Reparition DF by ID:如果我要设置sqlContext.sql("set spark.sql.shuffle.partitions=3")然后执行df.repartition($"ID"),我希望我的数据被重新分区为 3 个分区,一个分区包含 ID 为“A”的所有行的 3 个 val,另一个保存 ID 为“B”的所有行的 2 个 val,最后一个分区保存 ID 为“C”的所有行的 1 个 val。
  2. 场景 2:5 个 shuffle 分区,Reparititon DF by ID:在这种情况下,我仍然希望每个分区只保存带有相同 ID 标记的数据。也就是说,在同一个分区中不会有不同 ID 的行混合

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

  1. 我正在尝试优化数据帧的分区以避免偏差,但要让每个分区尽可能多地保存相同的关键信息。我如何使用set spark.sql.shuffle.partitionsand实现这一点df.repartiton

  2. set spark.sql.shuffle.partitions和之间有联系df.repartition吗?如果是这样,那个链接是什么?

谢谢!

标签: apache-sparkpysparkapache-spark-sql

解决方案


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

5 shuffle partitions,Reparititon DF by ID:在这种情况下,我仍然希望每个分区只保存带有相同 ID 标记的数据。也就是说,在同一个分区内不会有不同 ID 的行混合。

和不。

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

set spark.sql.shuffle.partitions 和 df.repartition 之间有联系吗?如果是这样,那个链接是什么?

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


推荐阅读