Werken met Parquet-bestanden

Data-pipelines schalen en optimaliseren met Polars

Liam Brannigan

Data Scientist & Polars Contributor

Bestandsopslagformaten

Diagram van een DataFrame

Data-pipelines schalen en optimaliseren met Polars

CSV-indeling

Diagram met CSV als rij-voor-rijopslag, met elk record over een volledige rij.

Data-pipelines schalen en optimaliseren met Polars

Parquet-indeling

Diagram met Parquet als kolomgeoriënteerde opslag, met waarden uit dezelfde kolom gegroepeerd.

Data-pipelines schalen en optimaliseren met Polars

Het archief converteren

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

)
Data-pipelines schalen en optimaliseren met Polars

Het archief converteren

(
    pl.read_csv("311_Service_Requests.csv", try_parse_dates=True)
    .write_parquet("311_Service_Requests.parquet")
)
Data-pipelines schalen en optimaliseren met Polars

Een Parquet-bestand inspecteren

pl.read_parquet_schema(
    "311_Service_Requests.parquet"
)
Schema(
    "CREATED_DATE": Datetime,
    "TYPE": String,
    "STATUS": String,
    "DEPARTMENT": String,
    "WARD": Int64,
    ...
)
Data-pipelines schalen en optimaliseren met Polars

CSV vs Parquet

$$

CSV
  • 4,8 GB
  • 14 seconden

$$

Parquet
  • 0,6 GB
  • 1,4 seconden

illustratie: csv vs parquet

Data-pipelines schalen en optimaliseren met Polars

Parquet is niet voor rijen toevoegen

new_request = {"TYPE": "Pothole", "STATUS": "Open", ...}
  • CSV voor toevoegen
  • Parquet voor lezen
Data-pipelines schalen en optimaliseren met Polars

Parquet-rowgroups

Diagram met Parquet-bestand verdeeld in row groups.

Data-pipelines schalen en optimaliseren met Polars

Filteren met rowgroups

(
    pl.scan_parquet("311_Service_Requests.parquet")
    .filter(pl.col("CREATED_DATE") < pl.datetime(2020, 1, 1))
)
Data-pipelines schalen en optimaliseren met Polars

Parquet-rowgroups

Diagram van een Parquet-bestand met rowgroups.

Data-pipelines schalen en optimaliseren met Polars

Parquet-rowgroups

Diagram van een Parquet-bestand met rowgroups en statistieken.

Data-pipelines schalen en optimaliseren met Polars

Scannen met parallelle strategieën

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

    )
)
Data-pipelines schalen en optimaliseren met Polars

Scannen met parallelle strategieën

(
    pl.scan_parquet(
        "311_Service_Requests.parquet",
        parallel="row_groups",
    )
)
  • columns
  • prefiltered
  • none
Data-pipelines schalen en optimaliseren met Polars

Parquet-schrijfsels beheersen

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

)
  • Kleinere bestanden
  • Langere lees- en schrijftijden
Data-pipelines schalen en optimaliseren met Polars

Parquet-schrijfsels beheersen

department_counts.write_parquet(
    "department_counts.parquet",
    compression_level=3,
    row_group_size=25_000,
)
  • Kleinere bestanden
  • Langere lees- en schrijftijden
  • Meer statistieken om te lezen
Data-pipelines schalen en optimaliseren met Polars

Laten we oefenen!

Data-pipelines schalen en optimaliseren met Polars

Preparing Video For Download...