Iskra es una biblioteca contenedora de Scala 3 alrededor de la API Apache Spark que permite escribir código Spark con seguridad tipográfica y sin repeticiones, pero aún así eficiente.
A partir del lanzamiento de 3.2.0, Spark se compila de forma cruzada también para Scala 2.13, lo que abre una manera de usar Spark a partir del código de Scala 3, ya que los proyectos de Scala 3 pueden depender de los artefactos de Scala 2.13.
Sin embargo, uno podría tener problemas al intentar llamar a un método que requiera una instancia implícita del tipo Encoder
de Spark. La derivación de instancias de Encoder
se basa en la presencia de un TypeTag
para un tipo determinado. Sin embargo, el compilador de Scala 3 ya no genera TypeTag
(y no hay planes para admitir esto), por lo que las instancias de Encoder
no se pueden sintetizar automáticamente en la mayoría de los casos.
Iskra intenta solucionar este problema utilizando sus propios codificadores (no relacionados con el tipo Encoder
de Spark) generados utilizando la nueva API de metaprogramación de Scala 3.
Iskra proporciona envoltorios delgados (pero fuertemente tipados) alrededor de DataFrame
, que rastrean los tipos y nombres de columnas en tiempo de compilación pero permiten que Catalyst realice todas sus optimizaciones en tiempo de ejecución.
Iskra utiliza tipos estructurales en lugar de clases de casos como modelos de datos, lo que nos da mucha flexibilidad (¡no es necesario definir explícitamente una nueva clase de caso cuando se agrega/elimina/cambia el nombre de una columna!) pero aún obtenemos errores de compilación cuando intentamos hacer referencia a una columna que no existe o que no se puede utilizar en un contexto determinado.
//> using lib " org.virtuslab::iskra:0.0.3 "
scala-cli repl --dep org.virtuslab::iskra:0.0.3
build.sbt
en un proyecto sbt: libraryDependencies + = " org.virtuslab " %% " iskra " % " 0.0.3 "
Iskra está construido con Scala 3.1.3, por lo que es compatible con Scala 3.1.x y versiones menores más recientes (¡a partir de 3.2.0 obtendrás completar el código para los nombres de las columnas en REPL y Metals!). Iskra depende transitivamente de Spark 3.2.0.
import org . virtuslab . iskra . api . *
given spark : SparkSession =
SparkSession
.builder()
.master( " local " )
.appName( " my-spark-app " )
.getOrCreate()
toTypedDF
en una Seq
de clases de casos, por ejemplo Seq ( Foo ( 1 , " abc " ), Foo ( 2 , " xyz " )).toTypedDF
typed
en él con un parámetro de tipo que representa una clase de caso, por ejemplo df.typed[ Foo ]
En caso de que por algún motivo necesite volver al mundo inseguro de los marcos de datos sin tipo, simplemente llame .untyped
en un marco de datos con tipo.
Esta biblioteca pretende parecerse al máximo a la API original de Spark (por ejemplo, utilizando los mismos nombres de métodos, etc.) siempre que sea posible, aunque intenta hacer que el código se parezca más a Scala normal sin textos repetitivos innecesarios y añadiendo algunas otras mejoras sintácticas.
Diferencias más importantes:
$.foo.bar
en lugar de $"foo.bar"
o col("foo.bar")
. Utilice comillas invertidas cuando sea necesario, por ejemplo, $.`column with spaces`
..select(...)
o .select{...}
debe devolver algo que sea una columna con nombre o una tupla de columnas con nombre. Debido a cómo funciona la sintaxis de Scala, puede escribir simplemente .select($.x, $.y)
en lugar de select(($.x, $.y))
. Con llaves puedes calcular valores intermedios como .select {
val sum = ($.x + $.y).as( " sum " )
($.x, $.y, sum)
}
foos.innerJoin(bars).on($.foos.barId === $.bars.id).select(...)
foos
y bars
se infirieron automáticamente Este proyecto está construido usando scala-cli, así que solo use los comandos tradicionales con .
como raíz como scala-cli compile .
o scala-cli test .
.
Para obtener una versión más reciente de la sección Usage
, busque aquí