gpt4 book ai didi

apache-spark - 排序后的数据框分区数?

转载 作者:行者123 更新时间:2023-12-05 00:46:45 27 4
gpt4 key购买 nike

spark使用orderBy后如何确定分区数?我一直认为生成的数据框有 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?

最佳答案

spark.sql.shuffle.partitions用作上限。最终分区数为1 <= partitions <= spark.sql.shuffle.partition .

正如您所提到的,Spark 中的排序通过 RangePartitioner .它试图实现的是将您的数据集划分为大致相等范围的指定数量(spark.sql.shuffle.partition)。

可以保证分区后相同的值将位于同一分区中。值得一试 RangePartitioning (不是公共(public) API 的一部分)类文档:

...

All row where the expressions in ordering evaluate to the same values will be in the same partition



如果不同排序值的数量小于所需的分区数,即可能的范围数小于 spark.sql.shuffle.partition ,您最终会得到较少数量的分区。另外,这里引用了 RangePartitioner 斯卡拉多克:

The actual number of partitions created by the RangePartitioner might not be the same as the partitions parameter, in the case where the number of sampled records is less than the value of partitions.



回到你的例子, n是一个常数 ( "a" ) 并且不能被分区。另一方面, i可以有 10,000 个可能的值,并被划分为 200 个( =spark.sql.shuffle.partition)范围或分区。

请注意,这仅适用于 DataFrame/Dataset API。当使用 RDD 的 sortByKey可以明确指定分区数,或者 Spark 将使用当前的分区数。

也可以看看:
  • How does Spark achieve sort order?
  • 关于apache-spark - 排序后的数据框分区数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53786188/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com