【问题标题】:Difference (if there is one) between spark.sql.shuffle.partitions and df.repartitionspark.sql.shuffle.partitions 和 df.repartition 之间的区别(如果有的话)
【发布时间】:2018-11-29 22:53:57
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    没有

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

    没有。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-17
      • 2018-01-24
      • 2016-02-14
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多