Перейти к содержанию

Операции с колонками

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)

Порядок применения

Важно понимать, в каком порядке происходят трансформации при чтении строки:

  1. Чтение из файла: Считываются только нужные исходные колонки.
  2. Маппинг имен: Применяются глобальные и файлы-специфичные переименования.
  3. Вычисляемые колонки: Выполняются функции, переданные в .alias(name, callable).
  4. Row Transforms: Выполняются функции, переданные в .map().
  5. Фильтрация по схеме: Удаляются колонки, не входящие в финальный output_schema или selected_columns.

Если вам мешает этот порядок (например, вы хотите сделать .map() над уже переименованными колонками), вы всегда можете вызвать .clone(), чтобы зафиксировать текущее состояние и начать новую цепочку.