Praca z plikami Parquet

Skalowanie i optymalizacja potoków danych w Polars

Liam Brannigan

Data Scientist & Polars Contributor

Formaty przechowywania plików

Diagram przedstawiający DataFrame

Skalowanie i optymalizacja potoków danych w Polars

Format CSV

Diagram pokazujący zapis CSV wiersz po wierszu, gdzie każdy rekord zajmuje cały wiersz.

Skalowanie i optymalizacja potoków danych w Polars

Format Parquet

Diagram pokazujący kolumnowy zapis Parquet, gdzie wartości z tej samej kolumny są grupowane razem.

Skalowanie i optymalizacja potoków danych w Polars

Konwersja archiwum

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

)
Skalowanie i optymalizacja potoków danych w Polars

Konwersja archiwum

(
    pl.read_csv("311_Service_Requests.csv", try_parse_dates=True)
    .write_parquet("311_Service_Requests.parquet")
)
Skalowanie i optymalizacja potoków danych w Polars

Inspekcja pliku Parquet

pl.read_parquet_schema(
    "311_Service_Requests.parquet"
)
Schema(
    "CREATED_DATE": Datetime,
    "TYPE": String,
    "STATUS": String,
    "DEPARTMENT": String,
    "WARD": Int64,
    ...
)
Skalowanie i optymalizacja potoków danych w Polars

CSV a Parquet

$$

CSV
  • 4,8 GB
  • 14 sekund

$$

Parquet
  • 0,6 GB
  • 1,4 sekundy

ilustracja porównująca csv i parquet

Skalowanie i optymalizacja potoków danych w Polars

Parquet nie nadaje się do dopisywania wierszy

new_request = {"TYPE": "Pothole", "STATUS": "Open", ...}
  • CSV do dopisywania wierszy
  • Parquet do odczytu
Skalowanie i optymalizacja potoków danych w Polars

Grupy wierszy w Parquet

Diagram pokazujący plik Parquet podzielony na grupy wierszy.

Skalowanie i optymalizacja potoków danych w Polars

Filtrowanie z użyciem grup wierszy

(
    pl.scan_parquet("311_Service_Requests.parquet")
    .filter(pl.col("CREATED_DATE") < pl.datetime(2020, 1, 1))
)
Skalowanie i optymalizacja potoków danych w Polars

Grupy wierszy w Parquet

Diagram pliku Parquet z grupami wierszy.

Skalowanie i optymalizacja potoków danych w Polars

Grupy wierszy w Parquet

Diagram pliku Parquet z grupami wierszy i statystykami.

Skalowanie i optymalizacja potoków danych w Polars

Skanowanie z różnymi strategiami równoległości

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

    )
)
Skalowanie i optymalizacja potoków danych w Polars

Skanowanie z różnymi strategiami równoległości

(
    pl.scan_parquet(
        "311_Service_Requests.parquet",
        parallel="row_groups",
    )
)
  • columns
  • prefiltered
  • none
Skalowanie i optymalizacja potoków danych w Polars

Kontrolowanie zapisu Parquet

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

)
  • Mniejszy rozmiar pliku
  • Dłuższy czas odczytu i zapisu
Skalowanie i optymalizacja potoków danych w Polars

Kontrolowanie zapisu Parquet

department_counts.write_parquet(
    "department_counts.parquet",
    compression_level=3,
    row_group_size=25_000,
)
  • Mniejszy rozmiar pliku
  • Dłuższy czas odczytu i zapisu
  • Więcej statystyk do odczytania
Skalowanie i optymalizacja potoków danych w Polars

Czas na praktykę!

Skalowanie i optymalizacja potoków danych w Polars

Preparing Video For Download...