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。