根据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中的问题(即如何在不生成空分区的情况下沿列重新分配),但为什么文档会说出与我在示例中观察到的内容不同的内容
答案 0 :(得分:0)
这是与Spark中启用的Tungsten project相关的内容。它使用硬件优化并调用哈希分区来触发随机操作。默认情况下,spark.sql.shuffle.partitions设置为200.您可以在重新分区之前和刚刚调用之后通过调用数据帧上的explain进行验证:
myDF.explain
val repartitionedDF = myDF.repartition($"x")
repartitionedDF.explain