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.
