Spark SQL : DataFrame repartitioncoalesce 对比

Posted 吊车尾88

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark SQL : DataFrame repartitioncoalesce 对比相关的知识,希望对你有一定的参考价值。

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。

 

以上是关于Spark SQL : DataFrame repartitioncoalesce 对比的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL中的DataFrame的创建

Spark-SQL之DataFrame操作大全

java的怎么操作spark的dataframe

在 spark.SQL DataFrame 和 pandas DataFrame 之间转换 [重复]

值 createGlobalTempView 不是 apache.org.spark.sql.DataFrame 的成员

spark sql 之 RDD与DataFrame互相转化