Apache Spark / Dataframe API vs. SQL
Pracovat s daty pomocí Apache Spark je možné hned několika způsoby. Pokud pocházíte spíše z prostředí softwarového vývoje, budete zřejmě inklinovat k použití Dataframe API, tzn. k volání funkcí select, filter, orderBy a dalších.
df.select(
col("hodnota").as("quantity"),
col("rok").as("year"),
col("DRUHZVIRE_txt").as("animal")
).filter(col("uzemi_txt") === lit("Olomoucký kraj"))
.filter(col("year") === lit("2018"))
.orderBy(desc("quantity"))
.show()
+--------+----+---------------+ |quantity|year| animal| +--------+----+---------------+ | 609373|2018| Drůbež| | 146772|2018| Slepice| | 92806|2018| Skot| | 85838|2018| Prasata| | 39619|2018| Krávy| | 9936|2018| Ovce| | 5589|2018|Prasnice chovné| | 1829|2018| Koně| | 1599|2018| Kozy| +--------+----+---------------+
Pro ty, kterým se na druhou stranu lépe přemýšlí ve „standardním“ SQL, je určen Spark SQL modul.
df.createOrReplaceTempView("animals")
sparkSession
.sql(
"""SELECT hodnota AS quantity
| , rok AS year
| , DRUHZVIRE_txt AS animal
| FROM animals
| WHERE (uzemi_txt='Olomoucký kraj')
| AND (rok='2018')
| ORDER BY 1 DESC
|""".stripMargin
)
.show()
+--------+----+---------------+ |quantity|year| animal| +--------+----+---------------+ | 609373|2018| Drůbež| | 146772|2018| Slepice| | 92806|2018| Skot| | 85838|2018| Prasata| | 39619|2018| Krávy| | 9936|2018| Ovce| | 5589|2018|Prasnice chovné| | 1829|2018| Koně| | 1599|2018| Kozy| +--------+----+---------------+
Oba přístupy mají své pro a proti, z hlediska výkonnosti jsou ale identické. Na pozadí se u obou dotazů nejdříve vygeneruje tzv. prázdný plán, který zaručuje formální správnost zápisu. Ten je dále podroben věcné analýze, tedy ověření, že použité tabulky a sloupce opravdu existují a že se použité datové typy shodují se zdrojovými daty. Teprve po tomto kroku vstupuje do hry jedna z nejsilnějších stránek Sparku – optimalizace, vytvoření několika fyzických plánů (= způsobů, jak příkazy provést na konkrétním železe) a následně volba toho, který dokáže dotaz zpracovat za co nejkratší čas a s co možná nejmenším množstvím prostředků.
Celý projekt s příklady je k dispozici na githubu.