Один и тот же текст при преобразовании в число может вызвать ошибку или стать отсутствующим значением. Разбираем влияние режима обработки и проверки результата.
Пропуск вместо ошибки тоже меняет результат
Представим условную выгрузку магазина. В столбце количества обычно стоят цифры, но в одной строке появился текст «уточняется». Перед подсчётом товары нужно представить числами. В одной среде обработка останавливается на такой строке; в другой завершается, но вместо количества появляется отсутствие значения. Зелёный статус запуска во втором случае ещё не подтверждает пригодность итогового отчёта.
Spark — система распределённой обработки данных; PySpark позволяет работать с ней через Python. Здесь нас интересует конкретное преобразование текста в число. Это следующий вопрос после определения структуры полей входящего файла: что делать, когда фактическое содержимое не соответствует ожидаемому числовому виду? Одного названия столбца для ответа недостаточно.
Режим задаёт реакцию на недопустимое значение
В документации Spark 4.0.1 описан строгий режим проверки операций. При явно заданном преобразовании неподходящего текста в целое число он вызывает ошибку. Приведённый там пример с отключённым режимом возвращает NULL — признак отсутствующего значения. Это описание определённой операции; другие ошибки и преобразования нужно рассматривать отдельно.
Для нашего магазина смысл различия практический. Остановка сообщает, что ожидаемое количество получить не удалось. Продолжение с пропуском оставляет задачу контроля команде: требуется обнаружить строку и решить, можно ли использовать оставшиеся данные. Переключение режима само по себе не объясняет, сколько товара было в исходной операции, и не исправляет неизвестное количество.
После обновления полезно проверить прежние предположения
В руководстве перехода к Spark 4.0 отмечено включение строгого режима по умолчанию. Поэтому при сравнении двух сред полезно узнать версию и фактические настройки. Само слово «Spark» не гарантирует одинаковой реакции. Названная здесь версия служит проверенной иллюстрацией поведения, а не утверждением о самой новой доступной версии.
Предложим для учебного проекта сохранить небольшой набор характерных входящих значений: обычное количество, предусмотренный пропуск и неподходящий текст. До большого переноса команда словами задаёт ожидаемый результат для каждого случая. После изменения среды этот набор помогает заметить смену поведения. Проверять стоит не только завершение запуска, но и то, какие значения оказались в результате.
Нужно сохранить причину появления пропуска
В нашем примере есть два разных события: источник изначально не передал количество либо передал текст, который не получилось преобразовать. Если оба случая превратились в одинаковый пропуск, важное различие исчезло. Для предложенного процесса сохраним исходное содержимое и отметку о причине затруднения отдельно от числового результата. Это позволит вернуться к вопросу без повторного угадывания.
Нельзя просто считать неизвестное количество нулевым: ноль означал бы известное отсутствие товара, а у нас нет подтверждённого числа. Также не стоит молча исключать такую строку из отчёта. Решение зависит от назначения результата: для одного учебного обзора допустим предварительный итог с оговоркой, для другого требуется дождаться исправления источника.
Политику обработки обсуждают до выпуска отчёта
Для условной команды предложим договориться, кто разбирает неподходящие значения, где виден их список и при каких обстоятельствах результат задерживают. Удобно отделить техническое обнаружение от решения владельца данных. Инженер может показать проблему и её масштаб, но не должен без согласования придумывать отсутствующее количество ради успешного завершения обработки.
Распределение вычислений объясняется в материале о работе Spark на нескольких узлах; оно не отменяет смыслового контроля входящих значений. Продолжить изучение можно на программе PySpark для инженеров и аналитиков данных. Первый полезный результат — объяснить словами, чем отличаются остановка, согласованный пропуск и исправленное исходное значение.


