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。
我不生产知识 我只是知识的搬运工