Big Data: Apache Spark erhält erste stabile Kotlin-API
JetBrains hat die erste Hauptversion welcher Kotlin-API zum Besten von Spark fertiggestellt. Sie gilt wie Feature-komplett und soll kompatibel sein zu den Kern-APIs von Spark.
Developer Von
- Silke Hahn
JetBrains hat eine neue Schnittstelle für die quelloffene Big-Data-Engine Apache Spark vorgelegt: Das Release gilt als die erste stabile Kotlin-API, die das Technologieunternehmen als "Feature-komplett" bezeichnet, und sie soll laut Releasemeldung mit den wesentlichen Apache-Spark-Schnittstellen zusammenarbeiten.
Typisiertes Selektieren und Sortieren à la Scala
Sechs Features stehen im Zentrum der Hauptversion, und einige dieser Eigenschaften sind bereits aus der entsprechenden API zu Scala bekannt: Typisiertes Selektieren (select) und Sortieren (sort), eine Reihe Kolumnen- beziehungsweise Spalten-Funktionen (der Begriff bezieht sich wohl auf eine Gruppe von Funktionen in Scala, die die "columns" von Datensätzen im Blick haben), Wrapper-Funktionen für die KeyValueGroupedDatasets, Unterstützung für die aus Scala bekannten TupleN-Klassen sowie für Datums- und Zeittypen. Zudem unterstützt die erste Major Version der neuen API auch Karten, die als Tuples kodiert sind.
Die typisierte Methode select gibt Datensätze der Tuples aus. Für Entwicklerinnen und Entwickler kann das fallweise praktischer sein als der Rückgriff auf die map-Funktion. Ein Nachteil dabei scheint zu sein, dass man die betreffende Kolumne, aus der die Daten zu beziehen sind, explizit mit ihrem korrekten Namen und Typ ansprechen muss. Das war in der Vergangenheit eine Fehlerquelle, die zu schwer behebbaren Problemen in der Pipeline geführt hatte.
Reflektive Syntax für Typsicherheit
Die neue API (als Erweiterung zur Scala-API betrachtet) kann offenbar das bekannte Problem durch eine typsichere Herangehensweise umgehen, die auf Strings und Casts verzichtet. Dabei spricht die Funktion – offenbar hergeleitet von der Reflection – die korrekte Spalte und den korrekten Typ an. Auch die Sortierfunktion soll eine solche reflektive Syntax erhalten haben, die nach dem gleichen Prinzip funktioniert. In Kotlin-Code sieht das aus wie folgt:
data class TestData(val id: Long, val name: String, val url: String) // ds is of type Dataset<TestData> val result: Dataset<Arity2<String, Long>> = ds.selectTyped(TestData::name, TestData::id)
Insgesamt 17 neue Spaltenfunktionen (Column Functions) weist das Release auf. Hier sind der API für Kotlin offenbar Grenzen gesetzt, da in Scala mehr solcher Funktionen möglich sind. Beispielsweise ist das Überschreiben von Klassen-Mitgliedern durch Erweiterungen ausgeschlossen, und die Klasse Dataset ist nicht erweiterbar. infix-Funktionen hingegen sind möglich, und es soll eine Reihe von Optionen geben, um Operator-ähnliche Funktionalität zu erreichen. Der Blogeintrag von JetBrains listet alle 17 Funktionen auf, die die Kotlin-API derzeit unterstützt.
Lesen Sie auch
Wrapper und Encoder
Die encoder()-Funktion zum automatischen Erstellen jeglicher Funktionsaufrufe, die einen Decoder oder Encoder benötigen, hatte Entwicklerinnen und Entwicklern bislang einen selektiven Zugriff auf die Funktionalitäten der Dataset-API ermöglicht. Die Kotlin-API 1.0 für Apache Spark ist nun laut Blogeintrag um einige Wrapper angereichert, die Nutzerinnen und Nutzer ihrem KeyValueGroupedDataset überstülpen können. Zudem unterstützt sie die drei Funktionen cogroup, flatMapGroupsWithState und mapGroupsWithState.
Die TupleN-Klassen aus Scala sollen in Kotlin-Code ausgedrückt deutlich einfacher einzugeben sein, da nun weniger komplexer Code notwendig ist, und der Bedarf an speziellen Encodern oder Lambdas innerhalb von Argumentlisten entfällt. Die Herausgeber der API demonstrieren das mit einem Codebeispiel:
ds .select(ds.col("a").`as`<String>, ds.col("b").`as`<Int>) .map { Tuple2(it._1(), it._2() + 1) }
Weitere Neuerungen und weiterführende Hinweise
Weitere Neuerungen im Bereich der Daten- und Zeittypen sind seit dem Erscheinen von Apache Spark 3.0 entwickelt worden. So sind die vormals standardmäßig registrierten Encoder für den Datums- und Zeitstempel nun durch eine breitere Unterstützung für LocalDate, Date, Timestamp und Instant als zugleich Top-Level-Einheiten der Datenbezugsrahmen und als Felder innerhalb von Strukturen vorgesehen.
Weitere Details lassen sich dem Blogeintrag von JetBrains entnehmen, eine Auflistung sämtlicher Änderungen findet sich im Changelog auf GitHub. Wer sich für das API-Release interessiert, findet bei Maven Central den Download.
(sih)
Quelle: www.heise.de