Diferencias entre RDDs y DataFrames en Apache Spark

Clase 3 de 25Curso de Fundamentos de Spark para Big Data

Resumen

¿Qué son los RDDs y los DataFrames en Spark?

En el mundo de la computación distribuida, es fundamental contar con herramientas potentes y flexibles que nos permitan manejar grandes volúmenes de datos eficientemente. Spark, una de las plataformas más utilizadas en este ámbito, nos ofrece dos principales estructuras de datos: los RDDs (Resilient Distributed Datasets) y los DataFrames. Comprender sus diferencias, usos y potenciales problemas es esencial para optimizar nuestros proyectos de análisis de datos y desarrollos en Spark.

¿Qué son los RDDs?

Los RDDs son la abstracción de datos básica en Spark, presentes desde su creación en 2009. Pueden entenderse como una especie de "lenguaje ensamblador" dentro de Spark, proporcionando la unidad mínima necesaria para procesar datos de manera distribuida. Esto implica que:

  • Son distribuidos: Los datos se reparten a lo largo de todo el clúster de máquinas conectadas.
  • No tienen estructura: Son solo listas o tuplas distribuidas, similares a diccionarios, lo que implica que una vez creados, no podemos modificar sus valores.
  • Inmutabilidad: Al igual que un diccionario una vez creado, no se puede alterar.
  • Ejecución perezosa (lazy execution): No se ejecutan hasta que se realiza una acción definitiva, lo cual puede introducir errores no previstos hasta el momento de dicha acción.

Ejemplo de uso básico de RDDs

val textFile = sc.textFile("hdfs://.../input.txt")
val errorsRDD = textFile.filter(line => line.contains("ERROR"))
errorsRDD.collect().foreach(println)

En este ejemplo, textFile es un RDD de líneas del archivo, que luego filtramos para obtener solo las líneas que contienen "ERROR".

¿Qué son los DataFrames?

Los DataFrames son una capa superior sobre los RDDs que introduce estructura en los datos. Esta estructura permite definir tipos y nombres de columna:

  • Estructura definida: Las columnas tienen tipos de datos específicos, por ejemplo, enteros o flotantes, y podemos nombrarlas.
  • Optimización: Sparck optimiza operaciones como conteos o uniones, haciendo los DataFrames generalmente más rápidos y eficientes que los RDDs.
  • Facilidad de uso: Podemos crear DataFrames a partir de bases de datos externas, archivos o incluso RDDs existentes, ofreciendo flexibilidad y simplicidad.

Ejemplo de uso básico de DataFrames

val peopleDF = spark.read.json("examples/src/main/resources/people.json")
peopleDF.show()
peopleDF.filter($"age" > 21).show()

En este ejemplo, leemos un archivo JSON como un DataFrame (peopleDF) y mostramos las personas mayores de 21 años aprovechando la estructura del DataFrame.

¿Cuándo usar RDDs o DataFrames?

Aunque los DataFrames parecen más eficientes y fáciles de usar, existen situaciones donde los RDDs son indispensables:

  • Compatibilidad con versiones anteriores: En entornos Spark más antiguos, solo existen RDDs, manteniendo la compatibilidad.
  • Control de flujo: Si se necesita un control detallado y evitar pasos adicionales que Spark podría agregar en DataFrames.
  • Integración con Python: Con RDDs es más fácil convertir datos para trabajar nativamente en Python.

Por otro lado, es preferible utilizar DataFrames para:

  • Tareas de alto nivel: Operaciones complejas como filtros, mapeos y agregaciones se facilitan notablemente.
  • Interacción con bases de datos: Los DataFrames pueden registrarse como tablas, permitiendo consultas similares a SQL.

Características compartidas de RDDs y DataFrames

Ambas estructuras comparten tres características clave: son distribuidos, inmutables y poseen ejecución perezosa. Sin embargo, la principal distinción del DataFrame es su estructura, que ofrece una ventaja significativa al trabajar con datos complejos y grandes volúmenes.

La comprensión de estas herramientas y sus aplicaciones puede mejorar sustancialmente el manejo de datos en Spark, dándote las herramientas necesarias para avanzar en proyectos más complejos y optimizados. ¡Sigue explorando y experimentando con ellas para maximizar su potencial!