Работа с файлами Parquet

Масштабирование и оптимизация конвейеров данных с Polars

Liam Brannigan

Data Scientist & Polars Contributor

Форматы хранения файлов

Диаграмма DataFrame

Масштабирование и оптимизация конвейеров данных с Polars

Формат CSV

Диаграмма, показывающая хранение CSV по строкам: каждая запись занимает целую строку.

Масштабирование и оптимизация конвейеров данных с Polars

Формат Parquet

Диаграмма, показывающая колоночное хранение Parquet: значения одного столбца сгруппированы вместе.

Масштабирование и оптимизация конвейеров данных с Polars

Конвертация архива

(
    pl.read_csv("311_Service_Requests.csv", try_parse_dates=True)

)
Масштабирование и оптимизация конвейеров данных с Polars

Конвертация архива

(
    pl.read_csv("311_Service_Requests.csv", try_parse_dates=True)
    .write_parquet("311_Service_Requests.parquet")
)
Масштабирование и оптимизация конвейеров данных с Polars

Изучение файла Parquet

pl.read_parquet_schema(
    "311_Service_Requests.parquet"
)
Schema(
    "CREATED_DATE": Datetime,
    "TYPE": String,
    "STATUS": String,
    "DEPARTMENT": String,
    "WARD": Int64,
    ...
)
Масштабирование и оптимизация конвейеров данных с Polars

CSV против Parquet

$$

CSV
  • 4,8 ГБ
  • 14 секунд

$$

Parquet
  • 0,6 ГБ
  • 1,4 секунды

Иллюстрация сравнения CSV и Parquet

Масштабирование и оптимизация конвейеров данных с Polars

Parquet не предназначен для добавления строк

new_request = {"TYPE": "Pothole", "STATUS": "Open", ...}
  • CSV — для добавления строк
  • Parquet — для чтения
Масштабирование и оптимизация конвейеров данных с Polars

Группы строк в Parquet

Диаграмма, показывающая файл Parquet, разделённый на группы строк.

Масштабирование и оптимизация конвейеров данных с Polars

Фильтрация с использованием групп строк

(
    pl.scan_parquet("311_Service_Requests.parquet")
    .filter(pl.col("CREATED_DATE") < pl.datetime(2020, 1, 1))
)
Масштабирование и оптимизация конвейеров данных с Polars

Группы строк в Parquet

Диаграмма файла Parquet с группами строк.

Масштабирование и оптимизация конвейеров данных с Polars

Группы строк в Parquet

Диаграмма файла Parquet с группами строк и статистикой.

Масштабирование и оптимизация конвейеров данных с Polars

Сканирование с параллельными стратегиями

(
    pl.scan_parquet(
        "311_Service_Requests.parquet",

    )
)
Масштабирование и оптимизация конвейеров данных с Polars

Сканирование с параллельными стратегиями

(
    pl.scan_parquet(
        "311_Service_Requests.parquet",
        parallel="row_groups",
    )
)
  • columns
  • prefiltered
  • none
Масштабирование и оптимизация конвейеров данных с Polars

Настройка записи Parquet

department_counts.write_parquet(
    "department_counts.parquet",
    compression_level=3,

)
  • Меньший размер файла
  • Увеличенное время чтения и записи
Масштабирование и оптимизация конвейеров данных с Polars

Настройка записи Parquet

department_counts.write_parquet(
    "department_counts.parquet",
    compression_level=3,
    row_group_size=25_000,
)
  • Меньший размер файла
  • Увеличенное время чтения и записи
  • Больше статистики для чтения
Масштабирование и оптимизация конвейеров данных с Polars

Давайте потренируемся!

Масштабирование и оптимизация конвейеров данных с Polars

Preparing Video For Download...