Optimisation et plans de requête

Mise à l'échelle et optimisation des pipelines de données avec Polars

Liam Brannigan

Data Scientist & Polars Contributor

Introduction à l'optimisation des requêtes

Image d'un tableau avec des lignes et des colonnes

Mise à l'échelle et optimisation des pipelines de données avec Polars

Introduction à l'optimisation des requêtes

Image d'un tableau avec des lignes et des colonnes

Mise à l'échelle et optimisation des pipelines de données avec Polars

Introduction à l'optimisation des requêtes

Image d'exécutions d'opérations en série

Mise à l'échelle et optimisation des pipelines de données avec Polars

Introduction à l'optimisation des requêtes

Image d'exécutions d'opérations en parallèle

Mise à l'échelle et optimisation des pipelines de données avec Polars

Introduction à l'optimisation des requêtes

Pipeline où des opérations en double sont exécutées deux fois

Mise à l'échelle et optimisation des pipelines de données avec Polars

Introduction à l'optimisation des requêtes

Pipeline réutilisant une branche pour éviter le travail en double

Mise à l'échelle et optimisation des pipelines de données avec Polars

Types de demandes les plus fréquents par service

department_request_types = (
    requests





)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Types de demandes les plus fréquents par service

department_request_types = (
    requests
    .filter(pl.col("STATUS") == "Completed")




)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Types de demandes les plus fréquents par service

department_request_types = (
    requests
    .filter(pl.col("STATUS") == "Completed")
    .group_by("DEPARTMENT")



)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Types de demandes les plus fréquents par service

department_request_types = (
    requests    
    .filter(pl.col("STATUS") == "Completed")
    .group_by("DEPARTMENT")
    .agg(pl.col("TYPE").n_unique().alias("n_request_types"))


)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Types de demandes les plus fréquents par service

department_request_types = (
    requests
    .filter(pl.col("STATUS") == "Completed")
    .group_by("DEPARTMENT")
    .agg(pl.col("TYPE").n_unique().alias("n_request_types"))
    .sort("n_request_types", descending=True)
    .head(5)
)
  • Plan « naïf »
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan non optimisé

print(department_request_types)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan non optimisé

print(department_request_types)







        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan non optimisé

print(department_request_types)





      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan non optimisé

print(department_request_types)


    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan non optimisé

print(department_request_types)
SLICE[offset: 0, len: 5]
  SORT BY [descending: [true]] [col("n_request_types")]
    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan optimisé

print(department_request_types.explain())
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan optimisé







        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan optimisé






      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan optimisé



    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan optimisé

SORT BY [slice: (0, 10, ...), descending: [true]] [col("n_request_types")]
  FILTER col("n_request_types").dynamic_predicate() FROM
    AGGREGATE[maintain_order: false]
      [col("TYPE").n_unique().alias("n_request_types")] BY [col("DEPARTMENT")]
      FROM
      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
  • Trouver les 10 premières lignes dans n_request_types
  • Écarter le reste
  • Trier ces 10 lignes
Mise à l'échelle et optimisation des pipelines de données avec Polars

Plan optimisé sous forme de graphe

print(department_request_types.show_graph())

Vue graphique du plan optimisé montrant l'analyse CSV avec optimisations.

Mise à l'échelle et optimisation des pipelines de données avec Polars

Autres optimisations

(
    requests








)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Autres optimisations

(
    requests
    .filter(pl.col("STATUS") == "Completed")
    .filter(pl.col("DEPARTMENT") == "Sanitation")






)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Autres optimisations

(
    requests
    .filter(pl.col("STATUS") == "Completed")
    .filter(pl.col("DEPARTMENT") == "Sanitation")
    .with_columns(
        pl.col("TYPE").str.to_lowercase().alias("type_lower")
    )
    .with_columns(
        pl.col("STATUS").str.to_lowercase().alias("status_lower")
    )
)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Autres optimisations



  Csv SCAN [311_Service_Requests.csv]
  PROJECT */39 COLUMNS
  SELECTION: [([(col("DEPARTMENT")) == ("Sanitation")]) & ([(col("STATUS")) == ("Completed")])]
  • Regroupement du prédicat AND
Mise à l'échelle et optimisation des pipelines de données avec Polars

Autres optimisations

 WITH_COLUMNS:
 [col("TYPE").str.to_lowercase().alias("type_lower"), col("STATUS").str.to_lowercase().alias("status_lower")]
  Csv SCAN [311_Service_Requests.csv]
  PROJECT */39 COLUMNS
  SELECTION: [([(col("DEPARTMENT")) == ("Sanitation")]) & ([(col("STATUS")) == ("Completed")])]
  • Regroupement du prédicat AND
  • Regroupement des expressions WITH_COLUMNS
Mise à l'échelle et optimisation des pipelines de données avec Polars

Passons à la pratique !

Mise à l'échelle et optimisation des pipelines de données avec Polars

Preparing Video For Download...