| Параметр | Spark | Pandas |
|---|---|---|
| Модель обработки | Распределённая: данные партиционируются по узлам кластера, обработка параллельная | In-memory на одной машине: весь DataFrame в RAM одного процесса |
| Модель вычислений | Ленивая (lazy): transformations строят DAG, выполнение только по action | Немедленная (eager): каждая операция выполняется сразу |
| Практический объём данных | От десятков ГБ до сотен ТБ (масштабируется горизонтально) | До нескольких ГБ (ограничено RAM машины, практически до ~50-70% памяти) |
| Порог перехода | Оправдан, когда данные не влезают в RAM или нужен кластер | Оптимален, пока датасет помещается в память с запасом |
| Синтаксис DataFrame API | df.filter(F.col('x')>1).groupBy('k').agg(F.sum('v')) — цепочки методов | df[df['x']>1].groupby('k')['v'].sum() — индексация и методы |
| SQL-интерфейс | Полноценный Spark SQL: spark.sql('SELECT ...') на временных вью | Нет нативного SQL; нужен pandasql/DuckDB или ручной перевод в методы |
| Скорость на малых данных | Медленнее: overhead на старт JVM, планировщик, сериализацию | Быстрее: нет накладных расходов, прямая работа с массивами NumPy |
| Скорость на больших данных | Быстрее и стабильнее: параллелизм, spill на диск при нехватке памяти | Деградирует или падает с MemoryError при превышении RAM |
| Экосистема | MLlib, Structured Streaming, Delta Lake, коннекторы к HDFS/S3/Hive/Kafka | NumPy, scikit-learn, matplotlib, огромный набор Python-библиотек |
| Кривая обучения | Круче: партиции, shuffle, lazy-модель, настройка кластера и памяти | Пологая: интуитивный API, быстрый старт, обширная документация |
| Инфраструктура и стоимость | Нужен кластер (Yarn/Kubernetes/Databricks) — дороже в эксплуатации | Обычный Python на ноутбуке или одном сервере — почти бесплатно |
Ключевой признак — данные перестают помещаться в оперативную память одной машины, и вы упираетесь в MemoryError или сильные тормоза от свопа. Практически это десятки ГБ и выше. Пока датасет влезает в RAM с запасом, pandas обычно быстрее и проще. Промежуточная альтернатива перед Spark — Polars или DuckDB: они дают колоночную обработку и out-of-core на одной машине без накладных расходов кластера.
В pandas вычисления eager: каждая операция выполняется сразу и возвращает результат. В Spark transformations (filter, select, groupBy, join) ленивые — они лишь строят план (DAG), а реальное выполнение запускается только при action (show, count, collect, write). Это позволяет Spark оптимизировать весь пайплайн через Catalyst-оптимизатор: переупорядочить фильтры, объединить шаги и минимизировать чтение данных.
Shuffle — это перераспределение данных между партициями по сети, которое происходит при операциях groupBy, join, distinct, repartition, оконных функциях с partitionBy. Он дорогой, потому что включает сериализацию, запись на диск и передачу по сети между узлами. Оптимизация shuffle (broadcast join для маленьких таблиц, правильное партиционирование, избегание лишних repartition) — частая тема на собеседованиях по Spark.
Логически да, но есть нюансы. Spark по умолчанию не гарантирует порядок строк без явного orderBy, тогда как pandas сохраняет порядок. Обработка NaN/null и типов может отличаться. В pandas groupby по умолчанию делает ключ индексом (as_index=True), в Spark результат — обычный DataFrame. Понимание этих различий полезно на практике — потренировать эквивалентную SQL-логику (GROUP BY, оконные функции, JOIN) можно в тренажёре на /sql-sandbox.
Postgresql vs Clickhouse · Pandas vs Polars · Tableau vs Powerbi Datalens Superset · SQL vs Pandas · Dbt vs Airflow · Redshift vs Bigquery vs Snowflake · Airflow vs Dagster vs Prefect · Greenplum vs Clickhouse · Excel vs SQL · Postgresql vs Mysql · Sqlite vs Postgresql · Power Bi vs Excel · Clickhouse vs Druid · Python vs R