2017-01-25 72 views
1

分区的数量根据星火1.6.3的文档,repartition(partitionExprs: Column*)应该保留分区的数量在生成的数据帧:星火据帧再分配:不保留

返回给定分区 分区的新数据帧表达式保留现有的分区数目

(从https://spark.apache.org/docs/1.6.3/api/scala/index.html#org.apache.spark.sql.DataFrame拍摄),但下面的例子似乎显示这样mething else(请注意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

是洗牌参数设置为true? – FaigB

+0

@FaigB不确定你指的是哪个参数?我在问题 –

+3

中添加了Spark-Conf可能的[在Apache Spark中删除空DataFrame分区]的副本(http://stackoverflow.com/questions/41854970/dropping-empty-dataframe-partitions-in-apache-spark) – user7337271

回答

0

这与在Spark中启用的Tungsten project有关。它使用硬件优化并调用哈希分区来触发混洗操作。默认情况下,spark.sql.shuffle.partitions被设置为200,您可以验证通过调用重新分区前,刚打完电话后您的数据帧解释:

myDF.explain 

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

repartitionedDF.explain 
+0

所以Docs是错的? –

+0

在shuffle中也使用散列,分区数量将根据映射器和减速器任务的数量而增加。 – FaigB