Назад к подготовке

Spark: RDD, DataFrame, Dataset и оптимизация job

Чем отличаются RDD, DataFrame и Dataset в Spark? Почему DataFrame обычно быстрее, и как использовать repartition, coalesce, cache и persist?

Ответить самому

Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.

Загрузка

Короткий ответ

RDD - низкоуровневая распределенная коллекция, DataFrame - schema-aware таблица с оптимизацией Catalyst/Tungsten, Dataset добавляет typed API в JVM. Repartition делает shuffle под новое число partitions, coalesce чаще уменьшает partitions дешевле, cache/persist материализуют переиспользуемые данные.

Полный разбор

RDD дает низкоуровневый контроль над распределенной immutable коллекцией, но Spark хуже понимает структуру вычисления. DataFrame представляет данные как таблицу со schema и column operations, поэтому Catalyst может оптимизировать logical plan: pushdown filters, pruning columns, reorder joins, выбрать физический план и code generation. Dataset в основном важен для Scala/Java как typed API поверх оптимизируемого плана.

DataFrame обычно быстрее не потому, что у него “есть индексы как в базе”, а потому что Spark видит колонки, predicates, aggregations и joins. Это позволяет убирать лишнюю работу и эффективнее исполнять pipeline.

Repartition создает новое распределение partitions и обычно вызывает shuffle; его используют для увеличения parallelism, перераспределения skew или подготовки к join/aggregation. Coalesce чаще уменьшает число partitions с меньшим shuffle, например перед записью. Cache и persist нужны только для reused intermediate datasets; persist позволяет выбрать storage level: memory, disk, serialized.

Теория

Spark performance определяется optimizer-ом, partition layout, shuffle cost и тем, материализуются ли переиспользуемые промежуточные данные.

Типичные ошибки

  • Объяснять скорость DataFrame индексами, которых по умолчанию нет.
  • Вызывать repartition без понимания shuffle cost.
  • Cache-ить данные, которые используются один раз.

Как отвечать на собеседовании

  • Назовите Catalyst/Tungsten при объяснении DataFrame.
  • Сравните repartition и coalesce через shuffle и число partitions.