随机分区配置对转换的影响有多大

问题描述 投票:0回答:1

基于随机分区配置的宽转换实际上是如何工作的?

如果我有以下程序:

spark.conf.set("spark.sql.shuffle.partitions", "5")
val df = spark
    .read
    .option("inferSchema", "true")
    .option("header", "true")
    .csv("...\input.csv")
df.sort("sal").take(200)

这是否意味着 sort 会输出 5 个新分区(根据配置),然后 Spark 从这 5 个分区中获取 200 条记录?

apache-spark apache-spark-dataset spark-shuffle
1个回答
0
投票

正如评论中提到的,您的示例代码不受影响,因为这种排序不会触发洗牌,在计划中您会发现类似的东西

 == Physical Plan ==
 TakeOrderedAndProject (2)
 +- Scan csv  (1)

但是例如,当您稍后进行一些连接(或任何其他将触发洗牌的宽转换)时,您可以看到在交换期间将使用此参数的值(检查分区行数)

启用自适应查询执行时情况可能并非如此,在这种情况下,它可能看起来像这样

现在您可以看到,一开始使用了 Spark.sql.shuffle.partitions 的值,但后来由于 AQE Spark 更改了计划,并且随机读取的分区数更改为 8(您还可能会看到 SMJ 更改为广播)哈希连接 - 也是由 AQE 完成的)

© www.soinside.com 2019 - 2024. All rights reserved.