Saltar al contenido

Desarrollando aplicaciones de Apache Spark: Scala vs. Python

Compilado vs. interpretado

Una de las primeras diferencias: Python es un lenguaje interpretado mientras que Scala es un lenguaje compilado. Bueno, sí y no, no es tan blanco y negro. Una nota rápida de que ser interpretado o compilado no es una propiedad del lenguaje, en cambio es una propiedad de la implementación que estás usando.

Desarrollando aplicaciones de Apache Spark: Scala vs. Python
Desarrollando aplicaciones de Apache Spark: Scala vs. Python

En CPython, en la implementación de referencia se ejecutan los archivos .py que contienen el código fuente que se compila en bytecode y luego se ejecuta. Por lo tanto, hay un paso de compilación, pero siempre puedes abrir el código fuente con vi o cualquier otro editor de texto, hacer un cambio y ejecutar de nuevo con ese cambio. Por eso Python es visto como un lenguaje interpretado, y puede ser bastante conveniente a la hora de codificar.

Por otro lado, con Scala necesitas compilar tu código, el cual crea un archivo que contiene el código de bytes que se ejecuta en la Máquina Virtual de Java. Dado que Scala se ejecuta sobre la JVM, significa que puede aprovechar las bibliotecas Java existentes, lo que aumenta enormemente la funcionalidad disponible. Así que, cuando necesitas hacer un pequeño cambio, no puedes simplemente abrir el código fuente con un editor de texto, hacer un cambio y volver a ejecutarlo. Necesitas compilar usando scalac (por ejemplo) y luego ejecutar. Esto no debería interponerse en tu camino, pero vale la pena mencionar que hay más que tendrás que aprender con Scala.

En similitudes, tanto Python como Scala tienen un Read Evaluate Print Loop (REPL), que es un shell interactivo de nivel superior que permite trabajar emitiendo comandos o declaraciones de una en una, obteniendo una retroalimentación inmediata. Lo mejor de todo es que puedes usar ambos con el Spark API. Cuando se usa Python es PySpark, y con Scala es Spark Shell.

Pros y contras

Rendimiento

Spark tiene dos APIs, la de bajo nivel, que utiliza conjuntos de datos distribuidos (RDDs) resistentes, y la de alto nivel donde se encuentran los DataFrames y los conjuntos de datos. En realidad, sólo encontrarás conjuntos de datos con DataFrames siendo un caso especial, aunque hay algunas diferencias entre ellos en cuanto al rendimiento.

Con los RDD, el rendimiento es mejor con Scala. ¿Por qué? Porque con Python, hay una sobrecarga adicional de comunicación JVM. Aunque no deberías tener problemas de rendimiento en Python, hay una diferencia.

Cuando se utiliza un API de nivel superior, la diferencia de rendimiento es menos notable. Spark funciona muy eficientemente con Python y Scala, especialmente con las grandes mejoras de rendimiento incluidas en Spark 2.3. (Puedes leer sobre esto con más detalle en la página de lanzamiento bajo PySpark Performance Improvements).

No olvides que estamos hablando de un marco distribuido masivamente en paralelo… uno que ya es bastante eficiente. Por lo tanto, es muy probable que se impresionen cuando procesen sus datos.

Seguridad de tipo

Esto es blanco y negro. La Scala está escrita estáticamente y la Python no. ¿Qué significa esto? Vamos a crear una prueba rápida y sencilla. Debajo hay una variable de tipo cadena con un número entero asignado. Esto se hace en el REPL para que sea más fácil de probar.