Optimalizace a plány dotazů

Scaling and Optimizing Data Pipelines with Polars

Liam Brannigan

Data Scientist & Polars Contributor

Úvod do optimalizace dotazů

Obrázek tabulky s řádky a sloupci

Scaling and Optimizing Data Pipelines with Polars

Úvod do optimalizace dotazů

Obrázek tabulky s řádky a sloupci

Scaling and Optimizing Data Pipelines with Polars

Úvod do optimalizace dotazů

Obrázek operací prováděných sériově

Scaling and Optimizing Data Pipelines with Polars

Úvod do optimalizace dotazů

Obrázek operací prováděných paralelně

Scaling and Optimizing Data Pipelines with Polars

Úvod do optimalizace dotazů

Pipeline s duplicitními operacemi prováděnými dvakrát

Scaling and Optimizing Data Pipelines with Polars

Úvod do optimalizace dotazů

Pipeline s duplicitními operacemi prováděnými dvakrát

Scaling and Optimizing Data Pipelines with Polars

Nejčastější typy požadavků podle oddělení

department_request_types = (
    requests





)
Scaling and Optimizing Data Pipelines with Polars

Nejčastější typy požadavků podle oddělení

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




)
Scaling and Optimizing Data Pipelines with Polars

Nejčastější typy požadavků podle oddělení

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



)
Scaling and Optimizing Data Pipelines with Polars

Nejčastější typy požadavků podle oddělení

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


)
Scaling and Optimizing Data Pipelines with Polars

Nejčastější typy požadavků podle oddělení

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)
)
  • Naivní plán
Scaling and Optimizing Data Pipelines with Polars

Neoptimalizovaný plán

print(department_request_types)
Scaling and Optimizing Data Pipelines with Polars

Neoptimalizovaný plán

print(department_request_types)







        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Scaling and Optimizing Data Pipelines with Polars

Neoptimalizovaný plán

print(department_request_types)





      FILTER [(col("STATUS")) == ("Completed")]
      FROM
        Csv SCAN [311_Service_Requests.csv]
        PROJECT */39 COLUMNS
Scaling and Optimizing Data Pipelines with Polars

Neoptimalizovaný plán

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
Scaling and Optimizing Data Pipelines with Polars

Neoptimalizovaný plán

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
Scaling and Optimizing Data Pipelines with Polars

Optimalizovaný plán

print(department_request_types.explain())
Scaling and Optimizing Data Pipelines with Polars

Optimalizovaný plán







        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Scaling and Optimizing Data Pipelines with Polars

Optimalizovaný plán






      simple pi 2/2 ["TYPE", "DEPARTMENT"]
        Csv SCAN [311_Service_Requests.csv]
        PROJECT 3/39 COLUMNS
        SELECTION: [(col("STATUS")) == ("Completed")]
Scaling and Optimizing Data Pipelines with Polars

Optimalizovaný plán



    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")]
Scaling and Optimizing Data Pipelines with Polars

Optimalizovaný plán

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")]
  • Nalezení 10 nejvyšších hodnot v n_request_types
  • Odfiltrování zbytku
  • Seřazení 10 řádků
Scaling and Optimizing Data Pipelines with Polars

Optimalizovaný plán jako graf

print(department_request_types.show_graph())

Grafické zobrazení optimalizovaného plánu se skenováním CSV a optimalizacemi.

Scaling and Optimizing Data Pipelines with Polars

Další optimalizace

(
    requests








)
Scaling and Optimizing Data Pipelines with Polars

Další optimalizace

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






)
Scaling and Optimizing Data Pipelines with Polars

Další optimalizace

(
    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")
    )
)
Scaling and Optimizing Data Pipelines with Polars

Další optimalizace



  Csv SCAN [311_Service_Requests.csv]
  PROJECT */39 COLUMNS
  SELECTION: [([(col("DEPARTMENT")) == ("Sanitation")]) & ([(col("STATUS")) == ("Completed")])]
  • Sloučený predikát AND
Scaling and Optimizing Data Pipelines with Polars

Další optimalizace

 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")])]
  • Sloučený predikát AND
  • Seskoupené výrazy WITH_COLUMNS
Scaling and Optimizing Data Pipelines with Polars

Pojďme si procvičit!

Scaling and Optimizing Data Pipelines with Polars

Preparing Video For Download...