Робота з файлами 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 GB
  • 14 секунд

$$

Parquet
  • 0,6 GB
  • 1,4 секунди

ілюстрація csv vs 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...