Predikát Zásobníkových :
V SQL, kdykoliv můžete použít dotaz, který má jak připojit a kde to stav, co se stane, je Připojit se poprvé stane, že v celé data a pak filtrování se stane, na základě toho, kde podmínkou. Co se stane, když jiskra se chová stejným způsobem jako SQL, pro velmi velké datové sady, připojit by trvat několik hodin výpočtů, aby se připojili dataset, protože se to děje přes nefiltrovaný dataset, po které opět to trvá několik hodin filtrovat pomocí, kde podmínkou.
predikát pushdown, samotný název je samovysvětlující, predikát je obecně kde podmínka, která se vrátí True nebo False. Během Mapě fáze co jiskra, co dělá je, že tlačí dolů predikát podmínky přímo do databáze, filtry dat na úrovni databáze pomocí predikátu podmínky, tedy snížení data načtená z databáze a zvyšuje výkon dotazu. Od filtrování se děje na úložiště dat, samotné dotazování je velmi rychlé a také od filtrování stalo se již vyhýbá přenos nefiltrovaných dat po síti a nyní pouze filtrovaná data je uložen v paměti.
pomocí metody explain můžeme vidět fyzický plán datového rámce, zda se používá predikát pushdown nebo ne. Predikáty musí být vrženy na odpovídající datový typ, pokud ne, pak predikáty nefungují.
>>> 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..
Ve výše uvedeném příkladu, jsem se snažil filtr dataset založených na časovém rámci, tlačil filtry zobrazí všechny predikáty, které musí být provedeny v průběhu datového souboru, v tomto příkladu, protože DateTime není správně odlita vyšší-než a menší než predikáty nejsou tlačil dolů do dataset.
>>> 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...
Ve výše uvedeném příkladu, datum je správně typ odlita na formát DateTime, nyní v vysvětlit, jste mohli vidět predikáty jsou tlačeny dolů.