Prædikatudtrængning:
når du bruger en forespørgsel, der både har join og hvor tilstand, sker det, der sker, først at Join sker på tværs af hele dataene, og derefter sker filtrering baseret på hvor tilstand. Hvad vil der ske, hvis spark opfører sig på samme måde som
prædikat push ned, selve navnet er selvforklarende, prædikat er generelt en hvor betingelse, som vil returnere sand eller falsk. I Kortfasen, hvad spark gør, er, det skubber prædikatbetingelserne direkte ned til databasen, filtrerer dataene på selve databaseniveauet ved hjælp af prædikatbetingelserne, hvilket reducerer de data, der hentes fra databasen, og forbedrer forespørgselsydelsen. Da filtreringen sker i selve datalageret, er forespørgslen meget hurtig, og også da filtrering allerede er sket, undgår det at overføre ufiltrerede data over netværket, og nu gemmes kun de filtrerede data i hukommelsen.
vi kan bruge forklaringsmetoden til at se den fysiske plan for dataframen, om prædikatudskydningen bruges eller ej. Prædikater skal støbes til den tilsvarende datatype, hvis ikke, fungerer prædikater ikke.
>>> df = spark.read.parquet("file1").filter((F.col("date") >= "2019-08-01") & (F.col("date") <= "2019-09-01"))>>> df.explain()
== Physical Plan ==
*(1) Project
+- *(1) Filter ((isnotnull(date#237) && (cast(date#237 as string) >= 2019-08-01)) && (cast(date#237 as string) <= 2019-09-01))
+- *(1) FileScan parquet Batched: true, Format: Parquet, Location: InMemoryFileIndex, PushedFilters: , ReadSchema: struct<id:string,date:date,day_of_week:int,hour_of_day:int,impressions:bigint,a..
i ovenstående eksempel forsøger jeg at filtrere et datasæt baseret på tidsrammen, skubbet filtre vil vise alle de prædikater, der skal udføres over datasættet, i dette eksempel, da DateTime ikke er korrekt støbt større end og mindre end prædikater ikke skubbes ned til datasæt.
>>> df = spark.read.parquet("file1").filter((F.col("date") >= datetime.strptime("2019-08-01", "%Y-%m-%d").date()) & (F.col("date") <= datetime.strptime("2019-09-01", "%Y-%m-%d").date()))>>> df.explain()
== Physical Plan ==
*(1) Project
+- *(1) Filter ((isnotnull(date#273) && (date#273 >= 18109)) && (date#273 <= 18140))
+- *(1) FileScan parquet Batched: true, Format: Parquet, Location: InMemoryFileIndex, PushedFilters: , ReadSchema: struct<frame_id:string,id:string,date:date,day_of_week:int,hour_of_day:int,impressions:bigint,a...
i ovenstående eksempel er datoen korrekt støbt til DateTime-format, nu i forklaringen kunne du se, at prædikaterne skubbes ned.