tehnici de optimizare Spark

predicat Pushdown :

în SQL, ori de câte ori utilizați o interogare care are atât se alăture și în cazul în care condiție, ceea ce se întâmplă este se alăture mai întâi se întâmplă în întreaga date și apoi filtrarea se întâmplă în funcție de unde condiție. Ce se va întâmpla dacă spark se comportă la fel ca SQL, pentru un set de date foarte mare, join-ul ar dura câteva ore de calcul pentru a se alătura setului de date, deoarece se întâmplă peste setul de date nefiltrate, după care din nou durează câteva ore pentru a filtra folosind condiția where.

predicat pushdown, numele în sine este auto-explicativ, predicat este, în general, o condiție în cazul în care, care va reveni adevărat sau fals. În timpul fazei de hartă, ceea ce face spark este că împinge în jos Condițiile predicatului direct în baza de date, filtrează datele la nivelul bazei de date în sine folosind condițiile predicatului, reducând astfel datele preluate din Baza de date și îmbunătățește performanța interogării. Deoarece filtrarea se întâmplă la magazinul de date în sine, interogarea este foarte rapidă și, de asemenea, deoarece filtrarea s-a întâmplat deja, evită transferul de date nefiltrate prin rețea și acum numai datele filtrate sunt stocate în memorie.
putem folosi metoda explain pentru a vedea planul fizic al cadrului de date dacă predicatul pushdown este utilizat sau nu. Predicatele trebuie să fie turnate la tipul de date corespunzător, dacă nu, atunci predicatele nu funcționează.

>>> 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..

în exemplul de mai sus, încerc să filtrez un set de date bazat pe intervalul de timp, filtrele împinse vor afișa toate predicatele care trebuie efectuate peste setul de date, în acest exemplu, deoarece DateTime nu este turnat în mod corespunzător mai mare decât și mai mică decât predicatele nu sunt împinse în jos la setul de date.

>>> 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...

în exemplul de mai sus, Data este corect tip turnat în format DateTime, acum în explica ai putea vedea predicatele sunt împinse în jos.

Lasă un răspuns

Adresa ta de email nu va fi publicată.

More: