Приложение «Гонца» раз в сутки выгружает заказы за день в CSV и кладёт файл в озеро. Этот файл ваша первая настоящая работа на DataFrame: прочитать, убедиться, что типы правильные, выбрать нужные колонки, отфильтровать и добавить вычисленную. Звучит просто, но первая же строчка прячет ловушку, на которой спотыкаются почти все.
Схема это договор
Представьте, что вы принимаете на склад коробки по накладной. В накладной написано: «коробка 1: 10 банок краски, коробка 2: 5 кистей». Если накладной нет, кладовщик открывает каждую коробку и гадает, что внутри. Где-то он угадает, где-то запишет банку краски как «что-то жидкое», и склад потом не найдёт её по описи.
Схема это накладная для данных. Её можно задать явно, а можно попросить Spark угадать.
Чтение CSV
У CSV нет встроенной схемы: это просто текст через запятую. Поэтому при чтении важны две опции:
header=Trueговорит, что первая строка файла это имена колонок, а не данные.inferSchema=Trueпросит Spark пройти по файлу и подобрать каждой колонке тип: если все значения похожи на целые числа, тип integer, если на даты, тип date.
Без inferSchema все колонки будут строками. С ним Spark запускает отдельное задание, чтобы прочитать файл целиком ещё до вашей работы. На гигабайтах это заметно.
Хуже другое. Вывод схемы честен к данным: если в колонке цен среди тысяч чисел встретилось одно «n/a», колонка целиком станет строкой. Код, который складывал цены, сломается или тихо начнёт делать не то.
Поэтому в пайплайнах схему задают явно. Проще всего строкой в стиле SQL: "id INT, status STRING, price_rub DOUBLE". Значения, которые не подходят под тип, Spark при чтении CSV превратит в NULL, и их можно найти фильтром.
урок из курса
Урок из курса «Data Engineering». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.