Predikat Pushdown:
I SQL, når du bruker en spørring som har både join og where condition, hva skjer Er Join first skjer over hele data og deretter filtrering skjer basert på where condition. Hva vil skje hvis spark oppfører seg på samme måte SOM SQL gjør, for et veldig stort datasett, vil sammenføyningen ta flere timer med beregning for å bli med i datasettet siden det skjer over det ufiltrerte datasettet, hvoretter det igjen tar flere timer å filtrere ved hjelp av where-tilstanden.
Predikat pushdown, selve navnet er selvforklarende, Predikat er generelt en where tilstand som vil returnere Sant eller Usant. Under Kartfasen hva spark gjør er, skyver den ned predikatforholdene direkte til databasen, filtrerer dataene på databasenivået selv ved hjelp av predikatbetingelsene, og reduserer dermed dataene hentet fra databasen og forbedrer spørringsytelsen. Siden filtreringen skjer i datalageret selv, er spørringen veldig rask, og siden filtrering allerede har skjedd, unngår det å overføre ufiltrerte data over nettverket, og nå lagres bare de filtrerte dataene i minnet.
vi kan bruke forklaringsmetoden for å se den fysiske planen for dataframe om predikat pushdown brukes eller ikke. Predikater må støpes til den tilsvarende datatypen, hvis ikke, fungerer ikke predikater.
>>> 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 eksemplet ovenfor prøver jeg å filtrere et datasett basert på tidsrammen, skyvede filtre vil vise alle predikatene som må utføres over datasettet, i dette eksemplet siden DateTime ikke er riktig støpt større enn og mindre enn predikater blir ikke presset ned til datasettet.
>>> 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 eksemplet ovenfor er datoen riktig skrevet støpt Til DateTime-format, nå i forklar kan du se at predikatene skyves ned.