【发布时间】:2019-05-16 02:32:47
【问题描述】:
使用orderBy后spark如何确定分区数?我一直认为生成的数据框有spark.sql.shuffle.partitions,但这似乎不是真的:
val df = (1 to 10000).map(i => ("a",i)).toDF("n","i").repartition(10).cache
df.orderBy($"i").rdd.getNumPartitions // = 200 (=spark.sql.shuffle.partitions)
df.orderBy($"n").rdd.getNumPartitions // = 2
在这两种情况下,spark都是+- Exchange rangepartitioning(i/n ASC NULLS FIRST, 200),那么第二种情况下得到的分区数怎么会是2呢?
【问题讨论】:
-
我将两者与explain extended进行了比较,这给了我所有的计划......所有计划都在同一条路径上,但唯一的区别是i字符串和n是数字。在 spark 内部进行 RangePartitioning 时....根据数据类型,它似乎有所不同。
-
我注意到的一件事是,如果您使用
df.orderBy($"n",$"i"),那么分区长度又是 200。所以这完全基于数据类型,发生在 spark api 中。 -
根据您的示例分别使用 a、b、c、d 联合 4 个 df 时获得 5 个。代码中一定有答案。
标签: apache-spark apache-spark-sql