Iskra ist eine Scala 3-Wrapper-Bibliothek rund um die Apache Spark-API, die das Schreiben von typsicherem und Boilerplate-freiem, aber dennoch effizientem Spark-Code ermöglicht.
Ab der Veröffentlichung von 3.2.0 wird Spark auch für Scala 2.13 kreuzkompiliert, was die Möglichkeit eröffnet, Spark aus Scala 3-Code zu verwenden, da Scala 3-Projekte von Scala 2.13-Artefakten abhängen können.
Allerdings kann es zu Problemen kommen, wenn man versucht, eine Methode aufzurufen, die eine implizite Instanz des Encoder
Typs von Spark erfordert. Die Ableitung von Encoder
Instanzen hängt vom Vorhandensein eines TypeTag
für einen bestimmten Typ ab. Allerdings werden TypeTag
nicht mehr vom Scala 3-Compiler generiert (und es gibt keine Pläne, dies zu unterstützen), sodass Instanzen von Encoder
in den meisten Fällen nicht automatisch synthetisiert werden können.
Iskra versucht, dieses Problem zu umgehen, indem es eigene Encoder verwendet (die nichts mit Encoder
Typ von Spark zu tun haben), die mit der neuen Metaprogrammierungs-API von Scala 3 generiert werden.
Iskra stellt dünne (aber stark typisierte) Wrapper für DataFrame
bereit, die Typen und Namen von Spalten zur Kompilierungszeit verfolgen, Catalyst jedoch alle Optimierungen zur Laufzeit durchführen lassen.
Iskra verwendet Strukturtypen anstelle von Fallklassen als Datenmodelle, was uns viel Flexibilität bietet (keine Notwendigkeit, explizit eine neue Fallklasse zu definieren, wenn eine Spalte hinzugefügt/entfernt/umbenannt wird!), aber wir erhalten immer noch Kompilierungsfehler, wenn wir es versuchen beziehen sich auf eine Spalte, die nicht existiert oder in einem bestimmten Kontext nicht verwendet werden kann.
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
in einem SBT-Projekt: libraryDependencies + = " org.virtuslab " %% " iskra " % " 0.0.3 "
Iskra wurde mit Scala 3.1.3 erstellt und ist daher mit Scala 3.1.x und neueren Nebenversionen kompatibel (ab 3.2.0 erhalten Sie Code-Vervollständigungen für Spaltennamen in REPL und Metals!). Iskra ist transitiv auf Spark 3.2.0 angewiesen.
import org . virtuslab . iskra . api . *
given spark : SparkSession =
SparkSession
.builder()
.master( " local " )
.appName( " my-spark-app " )
.getOrCreate()
toTypedDF
Erweiterungsmethode für eine Seq
von Fallklassen, z Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
Erweiterungsmethode mit einem Typparameter aufrufen, der eine Fallklasse darstellt, z. B df.typed[ Foo ]
Falls Sie aus irgendeinem Grund in die unsichere Welt der untypisierten Datenrahmen zurückkehren müssen, rufen Sie einfach .untyped
für einen typisierten Datenrahmen auf.
Diese Bibliothek soll soweit wie möglich der Original-API von Spark möglichst ähnlich sein (z. B. durch die Verwendung derselben Namen von Methoden usw.), versucht jedoch, den Code ohne unnötige Boilerplate eher wie normales Scala wirken zu lassen und einige andere syntaktische Verbesserungen hinzuzufügen.
Wichtigste Unterschiede:
$.foo.bar
statt $"foo.bar"
oder col("foo.bar")
. Verwenden Sie bei Bedarf Backticks, z. B. $.`column with spaces`
..select(...)
oder .select{...}
sollten Sie etwas zurückgeben, das eine benannte Spalte oder ein Tupel benannter Spalten ist. Aufgrund der Funktionsweise der Scala-Syntax können Sie einfach .select($.x, $.y)
anstelle von select(($.x, $.y))
schreiben. Mit geschweiften Klammern können Sie Zwischenwerte berechnen wie .select {
val sum = ($.x + $.y).as( " sum " )
($.x, $.y, sum)
}
foos.innerJoin(bars).on($.foos.barId === $.bars.id).select(...)
foos
und bars
automatisch abgeleitet Dieses Projekt wurde mit scala-cli erstellt, also verwenden Sie einfach die herkömmlichen Befehle mit .
als Root wie scala-cli compile .
oder scala-cli test .
.
Eine neuere Version des Abschnitts Usage
finden Sie hier