基于随机分区配置的宽转换实际上是如何工作的?
如果我有以下程序:
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 条记录?
正如评论中提到的,您的示例代码不受影响,因为这种排序不会触发洗牌,在计划中您会发现类似的东西
== Physical Plan ==
TakeOrderedAndProject (2)
+- Scan csv (1)
但是例如,当您稍后进行一些连接(或任何其他将触发洗牌的宽转换)时,您可以看到在交换期间将使用此参数的值(检查分区行数)
启用自适应查询执行时情况可能并非如此,在这种情况下,它可能看起来像这样
现在您可以看到,一开始使用了 Spark.sql.shuffle.partitions 的值,但后来由于 AQE Spark 更改了计划,并且随机读取的分区数更改为 8(您还可能会看到 SMJ 更改为广播)哈希连接 - 也是由 AQE 完成的)