1. 程式人生 > 實用技巧 >Spark SQL : DataFrame repartition、coalesce 對比

Spark SQL : DataFrame repartition、coalesce 對比

repartition

repartition 有三個過載的函式:

1) def repartition(numPartitions: Int): DataFrame

/**
   * Returns a new [[DataFrame]] that has exactly `numPartitions` partitions.
   * @group dfops
   * @since 1.3.0
   */
  def repartition(numPartitions: Int): DataFrame = withPlan {
    Repartition(numPartitions, shuffle 
= true, logicalPlan) }

此方法返回一個新的[[DataFrame]],該[[DataFrame]]具有確切的 'numpartition' 分割槽

2)defrepartition(partitionExprs: Column*): DataFrame

  @scala.annotation.varargs
  def repartition(partitionExprs: Column*): DataFrame = withPlan {
    RepartitionByExpression(partitionExprs.map(_.expr), logicalPlan, numPartitions 
= None) }

此方法返回一個新的[[DataFrame]]分割槽,它由保留現有分割槽數量的給定分割槽表示式劃分,分割槽數量由 spark.sql.shuffle.partition 決定。得到的DataFrame是雜湊分割槽的。

這與SQL (Hive QL)中的“distribution BY”操作相同。

3)def repartition(numPartitions: Int, partitionExprs: Column*): DataFrame

@scala.annotation.varargs
  def repartition(numPartitions: Int, partitionExprs: Column
*): DataFrame = withPlan { RepartitionByExpression(partitionExprs.map(_.expr), logicalPlan, Some(numPartitions)) }

此方法返回一個新的[[DataFrame]],由給定的分割槽表示式劃分為 'numpartition' 。得到的DataFrame是雜湊分割槽的。

這與SQL (Hive QL)中的“distribution BY”操作相同。

coalesce

1)coalesce(numPartitions: Int): DataFrame

  def coalesce(numPartitions: Int): DataFrame = withPlan {
    Repartition(numPartitions, shuffle = false, logicalPlan)
  }

返回一個新的[[DataFrame]],該[[DataFrame]]具有確切的 'numpartition' 分割槽。類似於在[[RDD]]上定義的coalesce,這種操作會導致一個狹窄的依賴關係,例如:

如果從1000個分割槽到100個分割槽,就不會出現shuffle,而是100個新分割槽中的每一個都會宣告10個當前分割槽。

反過來從100個分割槽到1000個分割槽,將會出現shuffle。