Iskra est une bibliothèque wrapper Scala 3 autour de l'API Apache Spark qui permet d'écrire du code Spark sécurisé et sans passe-partout, mais toujours efficace.
À partir de la version 3.2.0, Spark est également compilé de manière croisée pour Scala 2.13, ce qui ouvre la possibilité d'utiliser Spark à partir du code Scala 3, car les projets Scala 3 peuvent dépendre des artefacts Scala 2.13.
Cependant, on peut rencontrer des problèmes en essayant d'appeler une méthode nécessitant une instance implicite du type Encoder
de Spark. La dérivation d'instances d' Encoder
repose sur la présence d'un TypeTag
pour un type donné. Cependant, TypeTag
ne sont plus générés par le compilateur Scala 3 (et il n'est pas prévu de le prendre en charge), donc les instances de Encoder
ne peuvent pas être automatiquement synthétisées dans la plupart des cas.
Iskra essaie de contourner ce problème en utilisant ses propres encodeurs (sans rapport avec le type Encoder
de Spark) générés à l'aide de la nouvelle API de métaprogrammation de Scala 3.
Iskra fournit des wrappers fins (mais fortement typés) autour des DataFrame
, qui suivent les types et les noms des colonnes au moment de la compilation mais permettent à Catalyst d'effectuer toutes ses optimisations au moment de l'exécution.
Iskra utilise des types structurels plutôt que des classes de cas comme modèles de données, ce qui nous donne beaucoup de flexibilité (pas besoin de définir explicitement une nouvelle classe de cas lorsqu'une colonne est ajoutée/supprimée/renommée !) mais nous obtenons toujours des erreurs de compilation lorsque nous essayons de faire référence à une colonne qui n'existe pas ou qui ne peut pas être utilisée dans un contexte donné.
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
dans un projet sbt : libraryDependencies + = " org.virtuslab " %% " iskra " % " 0.0.3 "
Iskra est construit avec Scala 3.1.3, il est donc compatible avec Scala 3.1.x et les versions mineures plus récentes (à partir de la version 3.2.0, vous obtiendrez des complétions de code pour les noms de colonnes dans REPL et Metals !). Iskra dépend transitivement de Spark 3.2.0.
import org . virtuslab . iskra . api . *
given spark : SparkSession =
SparkSession
.builder()
.master( " local " )
.appName( " my-spark-app " )
.getOrCreate()
toTypedDF
sur une Seq
de classes de cas, par exemple Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
dessus avec un paramètre de type représentant une classe de cas, par exemple df.typed[ Foo ]
Au cas où vous auriez besoin de revenir dans le monde dangereux des trames de données non typées pour une raison quelconque, appelez simplement .untyped
sur une trame de données typée.
Cette bibliothèque a l'intention de ressembler au maximum à l'API originale de Spark (par exemple en utilisant les mêmes noms de méthodes, etc.) lorsque cela est possible, tout en essayant de faire en sorte que le code ressemble davantage à Scala normal sans passe-partout inutile et en ajoutant d'autres améliorations syntaxiques.
Différences les plus importantes :
$.foo.bar
au lieu de $"foo.bar"
ou col("foo.bar")
. Utilisez des backticks si nécessaire, par exemple $.`column with spaces`
..select(...)
ou .select{...}
vous devez renvoyer quelque chose qui est une colonne nommée ou un tuple de colonnes nommées. En raison du fonctionnement de la syntaxe Scala, vous pouvez écrire simplement .select($.x, $.y)
au lieu de select(($.x, $.y))
. Avec des accolades, vous pouvez calculer des valeurs intermédiaires comme .select {
val sum = ($.x + $.y).as( " sum " )
($.x, $.y, sum)
}
foos.innerJoin(bars).on($.foos.barId === $.bars.id).select(...)
foos
et bars
ont été automatiquement déduits Ce projet est construit à l'aide de scala-cli, utilisez donc simplement les commandes traditionnelles avec .
en tant que root comme scala-cli compile .
ou scala-cli test .
.
Pour une version plus récente de la section Usage
, regardez ici