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。