Predikaattipunnerrus :
SQL: ssä, kun käytät kyselyä, jossa on sekä liittyä että missä ehto, mitä tapahtuu on liittyä ensin koko dataan ja sitten suodatus tapahtuu sen mukaan missä ehto. Mitä tapahtuu, jos kipinä käyttäytyy samalla tavalla kuin SQL ei, sillä erittäin valtava aineisto, liittyä veisi useita tunteja laskennan liittyä aineisto, koska se tapahtuu yli suodattamaton aineisto, jonka jälkeen taas se kestää useita tunteja suodattaa käyttäen missä kunnossa.
predikaatti pushdown, nimi itsessään on itsestään selittävä, predikaatti on yleensä missä-ehto, joka palauttaa tosi tai epätosi. Karttavaiheen aikana spark työntää predikaattiolosuhteet suoraan tietokantaan, suodattaa tiedot itse tietokantatasolla predikaattiolosuhteiden avulla, mikä vähentää tietokannasta haettua dataa ja parantaa kyselyn suorituskykyä. Koska suodatus tapahtuu itse tietovarastossa, kyselyt ovat erittäin nopeita ja koska suodatus on jo tapahtunut, vältetään suodattamattomien tietojen siirtäminen verkon yli ja nyt vain suodatetut tiedot tallennetaan muistiin.
Voimme käyttää selitysmenetelmää nähdäksemme datakehyksen fysikaalisen suunnitelman käytetäänkö predikaattipunnerrusta vai ei. Predikaatit pitää valaa vastaavaan tietotyyppiin, jos ei niin predikaatit eivät toimi.
>>> 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..
yllä olevassa esimerkissä yritän suodattaa tietojoukkoa aikakehyksen perusteella, työnnetyt suodattimet näyttävät kaikki predikaatit, jotka on suoritettava datajoukon päällä, tässä esimerkissä koska DateTime ei ole oikein valettu suurempi-kuin ja pienempi kuin predikaatit ei työnnetä alas datajoukkoon.
>>> 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...
yllä olevassa esimerkissä päivämäärä on oikein tyypitetty DateTime-muotoon, nyt selityksessä saattoi nähdä predikaattien painuvan alas.