💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. Фрагменты относятся к Scala 3; внешняя библиотека названа прямо в коде или условии.
Вопрос 1 из 30
Какой вывод о теме «Оптимизатор Catalyst» можно сделать без дополнительных допущений?
Scala Оптимизатор Catalyst: чтение фрагмента Копировать
val result = df.withColumn("norm", lower(trim(col("name"))))
Catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы.
Фильтр, записанный после пользовательской функции, гарантированно будет перенесён Catalyst внутрь любого источника.
План выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок.
Проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов.
DataFrame в Scala всегда сохраняет статический тип доменных объектов, как `Dataset[CaseClass]`.
Вопрос 4 из 30
В контракте темы «Оптимизатор Catalyst» локальный пример стал частью более крупной системы. Какая трактовка контракта остаётся полной?
cost(plan)=\sum cost(operator_i)
Проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов; кэширование DataFrame, который читают один раз, замедляет задание и вытесняет более полезные данные.
Catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы; uDF скрывает выражение от оптимизатора и может помешать pushdown, folding и генерации эффективного кода.
Catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы; одного успешного запуска достаточно, чтобы подтвердить контракт на всех входах.
План выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок; uDF скрывает выражение от оптимизатора и может помешать pushdown, folding и генерации эффективного кода.
Catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы; запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи.
Вопрос 7 из 30
Для темы «План выполнения» какой пограничный случай относится к контракту, а не только к стилю записи?
Scala План выполнения: изменившийся контекст Копировать
// Дополнительный контекст: Задачу перезапустили после частичной записи результата.
import org.apache.spark.sql.functions.col
val filtered = result
.filter(col("score") > 0)
.select("id", "score")
filtered.explain("extended")
val preview = filtered.limit(20).collect()
println(preview.length)
Одного обычного запуска недостаточно, поскольку текст SQL не гарантирует порядок выполнения и сам по себе не показывает, где возникло перераспределение данных.
Одного обычного запуска недостаточно, поскольку запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи.
Одного обычного запуска недостаточно, поскольку broadcast join безопасен при любом размере правой таблицы: Spark сам отменит передачу до нехватки памяти.
Одного обычного запуска недостаточно, поскольку uDF скрывает выражение от оптимизатора и может помешать pushdown, folding и генерации эффективного кода.
Одного обычного запуска недостаточно, поскольку uDF сохраняет все оптимизации выражения, потому что Catalyst анализирует её тело как обычные функции SQL.
Вопрос 9 из 30
В контракте темы «План выполнения» условия эксплуатации изменились, но синтаксис остался прежним. Что теперь важно удержать вместе?
shuffle\ bytes=\sum partition\ exchange
Оставить в контракте правило «план выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок»; проверяемое ограничение — «текст SQL не гарантирует порядок выполнения и сам по себе не показывает, где возникло перераспределение данных».
Оставить в контракте правило «план выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок»; проверяемое ограничение — «uDF скрывает выражение от оптимизатора и может помешать pushdown, folding и генерации эффективного кода».
Оставить в контракте правило «план выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок»; проверяемое ограничение — «сборка и один штатный пример полностью доказывают корректность для пограничных данных».
Оставить в контракте правило «shuffle перераспределяет данные между executors и часто является главной ценой groupBy, distinct и join по несовпадающему partitioning»; проверяемое ограничение — «запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи».
Оставить в контракте правило «catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы»; проверяемое ограничение — «текст SQL не гарантирует порядок выполнения и сам по себе не показывает, где возникло перераспределение данных».
Вопрос 10 из 30
При проверке темы «План выполнения» что поможет соседнему модулю не повторить ту же ошибку?
План выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок. Считать регрессию закрытой, если проект один раз собрался.
Сравнивайте logical и physical plan, затем сверяйте estimated и actual rows в Spark UI. В проверке воспроизвести ситуацию: текст SQL не гарантирует порядок выполнения и сам по себе не показывает, где возникло перераспределение данных.
Сравнивайте logical и physical plan, затем сверяйте estimated и actual rows в Spark UI. В проверке воспроизвести ситуацию: uDF скрывает выражение от оптимизатора и может помешать pushdown, folding и генерации эффективного кода.
Сравнивайте контрольные наборы с дубликатами и null, проверяйте row count и ключевые агрегаты до и после изменения. В проверке воспроизвести ситуацию: текст SQL не гарантирует порядок выполнения и сам по себе не показывает, где возникло перераспределение данных.
В теме «План выполнения» исправить один показанный вызов по рекомендации «Настраивайте adaptive execution и целевой размер partition по метрикам реального набора». Общий контракт и прежнюю границу отдельно не воспроизводить.
Вопрос 12 из 30
Для темы «Перераспределение данных» объём данных вырос, изменился план выполнения и часть вычислений прошла через `shuffle`. Какой дефект остаётся возможным при корректном синтаксисе?
Scala Перераспределение данных: изменившийся контекст Копировать
// Дополнительный контекст: Объём данных вырос, изменился план выполнения и часть вычислений прошла через `shuffle`.
spark.conf.set("spark.sql.adaptive.enabled", "true")
val joined = left.join(right, Seq("id"))
Одного обычного запуска недостаточно, поскольку слишком маленькие partitions дают накладные расходы, слишком большие — spill и длинные задачи.
Одного обычного запуска недостаточно, поскольку запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи.
Одного обычного запуска недостаточно, поскольку broadcast join безопасен при любом размере правой таблицы: Spark сам отменит передачу до нехватки памяти.
Одного обычного запуска недостаточно, поскольку замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму.
Одного обычного запуска недостаточно, поскольку сравнение только количества строк достаточно, чтобы доказать эквивалентность старого и нового запроса.
Вопрос 14 из 30
В контракте темы «Перераспределение данных» какое решение не превращает частный успешный случай в общее обещание?
Кэширование сохраняет вычисленный результат для повторного использования, но занимает память и само требует первой materialization. Отдельная граница — замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму.
Shuffle перераспределяет данные между executors и часто является главной ценой groupBy, distinct и join по несовпадающему partitioning. Отдельная граница — слишком маленькие partitions дают накладные расходы, слишком большие — spill и длинные задачи.
Shuffle перераспределяет данные между executors и часто является главной ценой groupBy, distinct и join по несовпадающему partitioning. Отдельная граница — если основной сценарий прошёл, отрицательные и конкурентные случаи можно не проверять.
План выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок. Отдельная граница — слишком маленькие partitions дают накладные расходы, слишком большие — spill и длинные задачи.
Shuffle перераспределяет данные между executors и часто является главной ценой groupBy, distinct и join по несовпадающему partitioning. Отдельная граница — запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи.
Вопрос 19 из 30
В контракте темы «Кэширование» после изменения окружения команда пересматривает контракт. Какой вариант корректен?
В проектном решении сохранить утверждение «кэширование сохраняет вычисленный результат для повторного использования, но занимает память и само требует первой materialization» и риск «совпадение результата на одном наборе данных подтверждает все обещания публичного API».
В проектном решении сохранить утверждение «кэширование сохраняет вычисленный результат для повторного использования, но занимает память и само требует первой materialization» и риск «кэширование DataFrame, который читают один раз, замедляет задание и вытесняет более полезные данные».
В проектном решении сохранить утверждение «проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов» и риск «запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи».
В проектном решении сохранить утверждение «кэширование сохраняет вычисленный результат для повторного использования, но занимает память и само требует первой materialization» и риск «замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму».
В проектном решении сохранить утверждение «shuffle перераспределяет данные между executors и часто является главной ценой groupBy, distinct и join по несовпадающему partitioning» и риск «кэширование DataFrame, который читают один раз, замедляет задание и вытесняет более полезные данные».
Вопрос 24 из 30
В контракте темы «Проверка корректности» какая формулировка учитывает и семантику конструкции, и реальный риск?
Опираться на семантику «catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы», но отдельно проверять ограничение «замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму».
Опираться на семантику «проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов», но отдельно проверять ограничение «замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму».
Опираться на семантику «проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов», но отдельно проверять ограничение «успешный запуск без ошибок гарантирует сохранение статического типа при будущих изменениях».
Опираться на семантику «план выполнения показывает scan, filter, join, exchange и выбранную стратегию; фактические метрики важнее оценок», но отдельно проверять ограничение «запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи».
Опираться на семантику «проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов», но отдельно проверять ограничение «кэширование DataFrame, который читают один раз, замедляет задание и вытесняет более полезные данные».
Вопрос 25 из 30
При проверке темы «Проверка корректности» какой итог ревью содержит и действие, и способ заметить возврат риска?
В теме «Проверка корректности» исправить один показанный вызов по рекомендации «Кэшируйте только повторно используемую дорогую ветку, материализуйте её и обязательно освобождайте через unpersist». Общий контракт и прежнюю границу отдельно не воспроизводить.
Сравнивайте контрольные наборы с дубликатами и null, проверяйте row count и ключевые агрегаты до и после изменения. В проверке воспроизвести ситуацию: замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму.
Проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов. Сравнить вывод на одном наборе данных, не меняя условия выполнения.
Сравнивайте контрольные наборы с дубликатами и null, проверяйте row count и ключевые агрегаты до и после изменения. В проверке воспроизвести ситуацию: кэширование DataFrame, который читают один раз, замедляет задание и вытесняет более полезные данные.
Сравнивайте logical и physical plan, затем сверяйте estimated и actual rows в Spark UI. В проверке воспроизвести ситуацию: замена join или агрегата на «быстрый» вариант может изменить кратность строк и тихо исказить сумму.
Вопрос 29 из 30
В контракте темы «Устойчивость к сбоям» новый сценарий не отменяет основное правило, но делает заметной его границу. Какой ответ это отражает?
Устойчивость к сбоям опирается на повторяемость задач, стабильные входы и атомарную публикацию результата. Пограничный сценарий: достаточно проверить путь без ошибки, поскольку остальные ветви следуют той же семантике.
Catalyst анализирует логический план, применяет правила оптимизации и выбирает физические операторы. Пограничный сценарий: запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи.
Устойчивость к сбоям опирается на повторяемость задач, стабильные входы и атомарную публикацию результата. Пограничный сценарий: запись во внешний API из раздела данных без идемпотентности создаёт дубли при повторном запуске задачи.
Устойчивость к сбоям опирается на повторяемость задач, стабильные входы и атомарную публикацию результата. Пограничный сценарий: слишком маленькие partitions дают накладные расходы, слишком большие — spill и длинные задачи.
Проверка корректности оптимизации включает равенство результатов, null-семантику, дубли и границы числовых типов. Пограничный сценарий: uDF скрывает выражение от оптимизатора и может помешать pushdown, folding и генерации эффективного кода.