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是哈希分區的。

這與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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM