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

Материализация и экспорт

Если вы используете сложные трансформации (через .map() или .alias(lambda ...)), каждое чтение строки будет запускать выполнение вашего Python-кода. На больших данных это может стать "бутылочным горлышком".

Для решения этой проблемы библиотека предоставляет механизмы материализации — записи текущего состояния датасета в новый физический Parquet файл.

Метод to_parquet

Метод to_parquet просто сохраняет текущее состояние датасета на диск.

dataset.to_parquet("processed_data.parquet")

Шардирование (Sharding)

Если ваш датасет слишком велик для одного файла, вы можете разбить его на части (шарды):

# Разобьет датасет на файлы по 50,000 строк в директории 'shards/'
dataset.to_parquet("shards/", shard_size=50000)

Метод clone (Рекомендуется)

Метод clone делает то же самое, что и to_parquet, но возвращает новый экземпляр IndexedParquetDataset, который сразу смотрит на только что созданный файл.

Это лучший способ "запечь" фильтры и трансформации и продолжить работу с максимальной скоростью (zero-overhead).

# 1. Применяем медленные трансформации
ds = (IndexedParquetDataset.from_folder("./raw")
      .filter(heavy_logic)
      .map(complex_transform))

# 2. Клонируем в быстрый файл
fast_ds = ds.clone("baked_data.parquet")

# 3. Теперь fast_ds работает на порядки быстрее
row = fast_ds[0] 

Когда стоит делать материализацию?

  1. Сложные Python-трансформации: Если в цепочке есть .map() или .alias(callable).
  2. Тяжелая фильтрация: Если вы отфильтровали 90% данных из огромного датасета. Прямой доступ к оставшимся 10% в исходных файлах будет все еще быстрым, но индекс в памяти будет содержать много "дырок", а файловые дескрипторы будут висеть для всех исходных файлов.
  3. Подготовка для другого инструмента: Если вы хотите использовать очищенные данные в другом приложении (например, загрузить в Apache Spark).
  4. Финальная версия: Перед запуском длительного обучения модели на кластере.

Параметры записи

Вы можете настроить размер чанка во время записи:

dataset.to_parquet(
    "output.parquet", 
    chunk_size=1024 # Сколько строк накапливать в памяти перед сбросом в файл
)