Операции с колонками
IndexedParquetDataset позволяет изменять схему данных виртуально. Вы можете переименовывать колонки, создавать новые на основе существующих или приводить типы — всё это без изменения исходных файлов.
Выбор колонок (select_columns)
По умолчанию датасет возвращает все найденные колонки. Чтобы ускорить чтение (особенно по сети) и уменьшить потребление памяти, ограничьте выбор:
# Будут читаться и возвращаться только 'id' и 'text'
dataset = dataset.select_columns(["id", "text"])
Переименование и псевдонимы (rename / alias)
Метод .alias() — это универсальный инструмент для работы с именами колонок.
Простое переименование
# Теперь колонка 'raw_text' будет доступна под именем 'text'
dataset = dataset.alias("text", "raw_text")
# Синоним для alias
dataset = dataset.rename("raw_text", "text")
Вычисляемые колонки
Вы можете создать новую колонку на основе данных строки.
# Создаем колонку 'char_count', которая считает длину текста
dataset = dataset.alias("char_count", lambda row: len(row["text"]))
Произвольные преобразования (map)
Метод .map() позволяет изменить всю строку целиком или добавить/удалить несколько колонок за один раз. Это эффективнее нескольких вызовов .alias().
def preprocess(row):
row["text"] = row["text"].lower().strip()
row["is_long"] = len(row["text"]) > 100
return row
# Применяем функцию к каждой строке
dataset = dataset.map(preprocess)
# Можно одновременно удалить ненужные колонки
dataset = dataset.map(preprocess, remove_columns=["raw_metadata"])
# И явно зафиксировать схему результата (рекомендуется для стабильности)
dataset = dataset.map(preprocess, output_schema=["id", "text", "is_long"])
Явное приведение типов (cast)
Иногда данные в Parquet хранятся в неудобном формате (например, числа записаны как строки). Метод .cast() исправляет это.
# Приводим колонку к определенному типу
dataset = dataset.cast("price", "float") # Поддерживаются 'int', 'float', 'str'
# Или используем свою функцию для каста
dataset = dataset.cast("timestamp", pd.to_datetime)
Порядок применения
Важно понимать, в каком порядке происходят трансформации при чтении строки:
- Чтение из файла: Считываются только нужные исходные колонки.
- Маппинг имен: Применяются глобальные и файлы-специфичные переименования.
- Вычисляемые колонки: Выполняются функции, переданные в
.alias(name, callable). - Row Transforms: Выполняются функции, переданные в
.map(). - Фильтрация по схеме: Удаляются колонки, не входящие в финальный
output_schemaилиselected_columns.
Если вам мешает этот порядок (например, вы хотите сделать .map() над уже переименованными колонками), вы всегда можете вызвать .clone(), чтобы зафиксировать текущее состояние и начать новую цепочку.