Skip to content

Эволюция схем (Schema Evolution)

Одна из самых мощных возможностей indexed-parquet-dataset — это работа с наборами данных, структура которых менялась со временем. Это происходит, когда в процессе сбора данных добавляются новые признаки, удаляются старые или меняются названия колонок.

Проблема: Разные схемы в файлах

Обычно при попытке объединить файлы с разными схемами библиотеки (вроде Pandas или PyArrow) выдают ошибку или требуют ручной нормализации.

IndexedParquetDataset создает виртуальную объединенную схему, автоматически подставляя значения для отсутствующих колонок.

Работа с пропусками

Когда колонка есть в одном файле, но отсутствует в другом, библиотека должна вернуть какое-то значение для строк "пустого" файла.

Автоматическое заполнение (auto_fill)

Самый простой способ — включить auto_fill. Он заполнит пропуски разумными значениями (0 для чисел, пустая строка для текста, False для bool).

ds = IndexedParquetDataset.from_folder("data", auto_fill=True)

Иерархия заполнения значений

Вы можете настроить заполнение очень точечно. Библиотека ищет значение в следующем порядке:

  1. fill_values_by_column: Значение для конкретной колонки.
  2. fill_values_by_type: Значение для определенного типа данных PyArrow.
  3. default_fill_value: Глобальный запасной вариант (по умолчанию None).
ds = IndexedParquetDataset.from_folder(
    "data",
    default_fill_value="N/A",  
    fill_values_by_type={'int64': -1, 'double': 0.0},
    fill_values_by_column={'priority': 1}
)

Переименование и маппинг

Если колонка сменила имя (например, с label на target), вы можете нормализовать её двумя способами:

Глобальное переименование (rename)

Заставляет библиотеку считать, что label теперь называется target во всех файлах.

ds = ds.rename("label", "target")

Маппинг для конкретного файла (set_file_mapping)

Если только в одном конкретном файле колонка называется странно, вы можете исправить это точечно:

ds = ds.set_file_mapping(
    "data/v1/bad_file.parquet", 
    {"old_name": "correct_name"}
)

Объединение разных датасетов (merge)

Если у вас есть два разных IndexedParquetDataset, вы можете объединить их в один. Библиотека автоматически: 1. Вычислит общую схему. 2. Выполнит upcasting типов (например, если в одном датасете колонка id это int32, а в другом int64, итоговая будет int64). 3. Удалит дубликаты строк (те, что ссылаются на один и тот же файл и физический индекс строки).

combined_ds = ds1.merge(ds2)

Вложенные структуры (Structs)

Библиотека умеет рекурсивно заходить внутрь колонок типа Struct. Если внутри структуры не хватает поля, оно будет заполнено согласно правилам выше. Это критически важно для PyTorch, который не умеет собирать батчи, содержащие None на любом уровне вложенности.