天天看點

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) def repartition(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是哈希分區的。

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。

我不生産知識 我隻是知識的搬運工