Dominar la creación y transformación de RDDs (Resilient Distributed Datasets) es el primer paso para trabajar con Apache Spark de forma efectiva. A continuación se explican las formas prácticas de construir estos objetos distribuidos e inmutables, y se recorren las transformaciones más utilizadas dentro de la plataforma Databricks.
¿Cómo preparar el entorno en Databricks para trabajar con RDDs?
Antes de escribir código, es necesario tener el clúster activo y dirigirse a la sección de Workspace [0:08]. Desde allí se puede importar un notebook usando el botón de importación, ya sea arrastrando un archivo o pegando una URL, por ejemplo de un repositorio en GitHub [0:38]. Los formatos compatibles incluyen .dbc, .scala, .py, .sql, .r, .ipynb, .rmd, .html y .zip [0:55]. Una vez importado el notebook, hay que atachar el clúster en la sección de conexión para poder ejecutar el código [2:00].
Dos conceptos fundamentales aparecen al iniciar: el SparkSession, que es el punto de entrada principal para trabajar con Spark, y el SparkContext, que permite interactuar directamente con el clúster [2:12]. Existen dos formas de crear la sesión: una forma larga, donde se importa SparkSession desde PySpark y se configuran parámetros como el master y el nombre de la aplicación con getOrCreate [2:40]; y una forma corta que utiliza todos los valores por default [3:12]. Dentro de Databricks no es necesario crear ni la sesión ni el contexto, porque la plataforma ya los tiene preconfigurados como parte de su administración del clúster [3:24].
¿Cuáles son las formas de crear un RDD en Spark?
Los RDD son objetos inmutables, distribuidos y tolerantes a fallos, la unidad fundamental con la que trabaja Apache Spark [4:05].
- RDD vacío: se utiliza la forma
emptyRDD para generar un RDD sin datos [4:14].
- RDD con particiones definidas: mediante la función parallelize se puede crear un RDD indicando el número de particiones, por ejemplo tres [4:22]. Esta función sirve para convertir una colección local en un objeto distribuido que puede ejecutarse en paralelo.
- Verificar particiones: la función
getNumPartitions devuelve la cantidad de particiones que tiene un RDD [4:52].
También se puede partir de una lista de Python, por ejemplo [1, 2, 3, 4, 5], y aplicarle parallelize para obtener un RDD con todas las características necesarias para Spark [5:08]. Si no se define un número de particiones, Spark lo asigna automáticamente y puede variar entre ejecuciones [5:48].
Para visualizar el contenido de cualquier RDD se usa la acción collect, que recoge los resultados y los muestra [4:40].
¿Qué transformaciones se pueden aplicar a los RDDs?
Las transformaciones modifican un RDD y devuelven siempre un nuevo objeto, ya que los RDDs son inmutables. Además, son de tipo lazy (perezosas): no se ejecutan hasta que una acción como collect las dispara [6:10].
¿Cómo funciona la transformación map?
La función map aplica una operación a cada elemento del RDD [6:30]. En el ejemplo, se usa una función lambda que multiplica cada valor por dos: si el RDD contiene [1, 2, 3, 4, 5], el resultado será [2, 4, 6, 8, 10] [6:44].
¿Cómo filtrar y obtener elementos únicos?
- filter: permite quedarse solo con los elementos que cumplen una condición [7:28]. Por ejemplo, para obtener los números pares se evalúa si el resto de dividir por dos es cero. Del RDD
[1, 2, 3, 4, 5] se obtiene [2, 4] [7:58].
- distinct: retorna únicamente los valores no repetidos del RDD [8:14]. Si existen duplicados como el once o el cinco,
distinct los presenta una sola vez.
¿Qué hacen reduceByKey y sortByKey?
- reduceByKey: trabaja con pares clave-valor y agrega los valores según la clave [8:44]. Si se tienen pares como
(A,3), (B,2), (C,4), (A,3), (B,2), (C,2), la función suma los valores por clave y produce (A,6), (B,4), (C,6) [9:20].
- sortByKey: ordena el RDD por la clave de forma ascendente por defecto [10:08]. Para invertir el orden se añade el parámetro
ascending=False, obteniendo un ordenamiento descendente [10:38].
Existen otras transformaciones adicionales como sample, groupByKey o flatMap que amplían las posibilidades de manipulación de datos [10:58].
Si ya replicaste estos ejemplos en tu entorno, comparte en los comentarios qué transformación te resultó más útil o qué caso de uso estás explorando con RDDs.