Adaptive Query Execution: что AQE чинит уже во время выполнения
Catalyst строит план до запуска, опираясь на оценки размеров, а они часто врут — особенно после фильтров и джойнов. AQE пересматривает план по ходу выполнения, глядя на фактическую статистику завершённых стадий, и включён по умолчанию начиная с версии 3.2. Он делает три вещи. Склеивает мелкие партиции после shuffle: вместо жёстких 200 партиций получается столько, сколько нужно под реальный объём — это снимает главную боль от неудачно выбранного spark.sql.shuffle.partitions. Меняет стратегию джойна: если после фильтрации одна сторона оказалась маленькой, SortMergeJoin превращается в BroadcastHashJoin уже во время выполнения. Разбивает перекошенные партиции на части, лечя перекос без ручного соления. Практическое следствие: explain() показывает план до выполнения, а настоящий виден только в Spark UI, где у узлов появляются пометки AQEShuffleRead.