Skip to content
3 / 15

DataFrame и ленивые вычисления: трансформации против действий

Всё API Spark делится на две группы. Трансформации (select, filter, groupBy, join, withColumn) ничего не вычисляют — они достраивают план. Действия (count, collect, show, write, take) запускают вычисление всей накопленной цепочки. Отсюда поведение, которое сбивает с толку новичков: строка с join выполняется мгновенно, а count() через двадцать строк работает десять минут — потому что там и происходит вся работа. Ленивость даёт оптимизатору возможность увидеть весь конвейер целиком и переписать его: протолкнуть фильтр к источнику, отбросить неиспользуемые колонки, объединить последовательные операции. Второе следствие — датафрейм не хранит результат: каждое новое действие пересчитывает цепочку с нуля, включая повторное чтение файлов. Именно поэтому существует cache(). Отдельно стоит printSchema() и вывод схемы при чтении — они могут запустить чтение части данных даже без действия.

DataFrame и ленивые вычисления: трансформации против действий | JScriptiser