Какой API Spark вы используете: PySpark, Scala или Spark SQL?
Что проверяют
Работали ли вы со Spark руками или знаете его по названию, и понимаете ли, что выбор API почти не влияет на скорость. Следом обычно просят показать, как вы смотрите план запроса или почему тормозит конкретная джоба.
Как отвечать
Начните с честного ответа про свой стек: аналитик чаще всего пишет на Spark SQL и PySpark в ноутбуках (Jupyter, Databricks, Zeppelin), Scala встречается реже и в основном у дата-инженеров. Затем покажите, что понимаете устройство:
- общий движок: SQL-запрос, DataFrame из PySpark и DataFrame из Scala проходят через один оптимизатор Catalyst и превращаются в одинаковый физический план. На операциях DataFrame разницы в скорости между языками нет, проверить это можно через
explain(); - Spark SQL: удобен для агрегаций, джойнов и оконных функций, его читает любой аналитик;
- PySpark: нужен, когда логика не укладывается в один запрос: циклы по датам, параметры, сборка признаков, связка с pandas и визуализацией. Смешивать удобно:
spark.sql(...)возвращает DataFrame, аcreateOrReplaceTempViewпревращает DataFrame в таблицу для SQL; - Scala: типизированный
Datasetи прямой доступ к внутренним API. Имеет смысл в промышленных пайплайнах, в аналитике встречается редко.
Где язык всё-таки важен, так это пользовательские функции. Обычный Python UDF гоняет данные между JVM и Python-процессом и может замедлить джобу в разы. Сначала ищите готовую функцию в pyspark.sql.functions, а если её нет, берите pandas UDF, который передаёт данные пачками через Arrow.
Закончите своим примером: задача, объём данных и почему выбрали SQL или DataFrame API.
Где спотыкаются
Утверждают, что Scala «в разы быстрее Python». Для DataFrame и SQL это неверно, разница появляется только на UDF и низкоуровневых RDD.
Пишут Python UDF на то, что уже есть во встроенных функциях: разбор дат, регулярки, when/otherwise. Оптимизатор не заглядывает внутрь такой функции и не может толком её оптимизировать.
Вызывают toPandas() или collect() на всём датафрейме. Данные целиком едут на драйвер, и на больших таблицах джоба падает по памяти.