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.