Spark DataFrame重新分区:未保留的分区数

时间:2017-01-25 15:01:36

标签: scala apache-spark

根据Spark 1.6.3的文档,repartition(partitionExprs: Column*)应保留结果数据框中的分区数:

  

返回由给定分区分区的新DataFrame   保留现有分区数的表达式

(摘自https://spark.apache.org/docs/1.6.3/api/scala/index.html#org.apache.spark.sql.DataFrame

但以下示例似乎显示了其他内容(请注意,在我的情况下,spark-master为local[4]):

val sc = new SparkContext(new SparkConf().setAppName("Demo").setMaster("local[4]"))
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._

val myDF = sc.parallelize(Seq(1,1,2,2,3,3)).toDF("x")
myDF.rdd.getNumPartitions // 4 
myDF.repartition($"x").rdd.getNumPartitions //  200 !

怎么解释?我使用Spark 1.6.3作为独立应用程序(即在IntelliJ IDEA中本地运行)

编辑:此问题并未解决Dropping empty DataFrame partitions in Apache Spark中的问题(即如何在不生成空分区的情况下沿列重新分配),但为什么文档会说出与我在示例中观察到的内容不同的内容

1 个答案:

答案 0 :(得分:0)

这是与Spark中启用的Tungsten project相关的内容。它使用硬件优化并调用哈希分区来触发随机操作。默认情况下,spark.sql.shuffle.partitions设置为200.您可以在重新分区之前和刚刚调用之后通过调用数据帧上的explain进行验证:

myDF.explain

val repartitionedDF = myDF.repartition($"x")

repartitionedDF.explain