SparkSQL中shuffle时,Spark如何决定下一阶段的分区数



我当然知道spark.sql.shuffle.partitions配置,
但例如,当我在只有200行的小数据集上设置此配置300时,配置无效,实际分区数只有2,
另一个例子,我在有300亿行的数据集上设置此配置3000,配置也无效,实际的分区数只有600,
我们看到,当我们在一个小数据集上设置一个大值的分区配置时,该配置将无效,
所以我只想知道SparkSQL中shuffle时,Spark是如何决定下一阶段的分区数的?或者如何强制此配置有效
My Spark SQL如下所示:

set spark.sql.shuffle.partitions=3000;
with base_data as (
select 
device_id
from
table_name
where
dt = '20210621'
distribute by
rand()
)
select count(1) from base_data

一般情况下,窄转换不会更改分区数。

宽转换转换不会更改分区数。

窄转换在窄转换中,计算单个分区中的记录所需的所有元素都位于父RDD的单个分区中。使用分区的有限子集来计算结果。窄变换是map((和filter((的结果。

宽转换--在宽转换中,计算单个分区中的记录所需的所有元素可能存在于父RDD的多个分区中。该分区可能存在于父RDD的许多分区中。宽转换是groupbyKey和reducebyKey的结果。

问题更改后的更新:

你可以假设";spark.sql.shuffle.分区"作为一个查询提示,在我看来,我们正在强制执行器为联接或聚合创建该数量的分区,除非我们非常确定没有分组密钥,否则我们不应该使用该值。

这将使网络上的数据不必要地搅乱。

最新更新