Catalyst и Tungsten: что оптимизатор делает с вашим кодом
Catalyst — оптимизатор запросов, превращающий ваш код в план выполнения за четыре шага: разбор и связывание имён с источниками (analyzed plan), правила оптимизации (optimized plan), выбор физических операторов (physical plan), генерация кода. Главные правила, которые он применяет: проталкивание предикатов — фильтр уезжает в источник, и Parquet отдаёт только нужные строки; отсечение колонок — читаются только те поля, которые действительно используются; свёртка констант, устранение лишних проекций, переупорядочивание джойнов по оценкам размеров. Tungsten — слой выполнения: он хранит данные во внедиспетчерной бинарной памяти вместо Java-объектов, что снимает нагрузку со сборщика мусора, и генерирует Java-код для целой цепочки операторов (whole-stage codegen), убирая накладные расходы на виртуальные вызовы. Практический вывод: DataFrame API и Spark SQL оптимизируются, а вот Python UDF для Catalyst — чёрный ящик, вокруг которого оптимизация останавливается.