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!
Principal abstracción de datos: Es la unidad básica, existen desde su inicio hasta su versión 3.0.
Distribución: Los RDD se dritribuyen y particionan a lo largo del clúster.
Creación simple: Al no poseer estructura formalmente, adoptan las más intuitiva.
Inmutabilidad: Posterior a su creación no se pueden modificar
Ejecución perezosa: A menos que se realice una acción.
Características de los DataFrame
Formato: A diferencia de un RDD poseen columnas, lo cual les otorga tipos de datos.
Optimización: Poseen una mejor implementación, lo cual los hace preferibles.
Facilidad de creación: Se pueden crear desde una base de datos externa, archivo o RDD existente.
¿Cuándo usar un RDD?
Cuando te interesa controlar el flujo de Spark.
Si eres usuario Python, convertir a RDD un conjunto permite mejor control de datos.
Estás conectándote a versiones antiguas de spark.
¿Cuándo usar DataFrames?
Si poseemos semánticas de datos complicadas.
Vamos a realizar tareas de alto nivel como filtros, mapeos, agregaciones, promedios o sumas.
Si vamos a usar sentencias SQL.
Menciona que los RDD son inmutables, como los diccionarios. Pero, creo que lo que quizo decir fue referirse a que son inmutables, como las duplas. Es decir, una vez creadas no se pueden modificar sus valores.
Todo lo anterior refiriéndome en el caso que esté hablando de Python, desconozco como sea en Scala o R.
Pensé lo mismo
Asi es, me surgio la misma duda cuando lo menciono
Yo tengo una mejor pregunta ¿que es RDD?
"Uno de los pilares base de Apache Spark, los Resilient Distributed Datasets (RDD), se tratan de datasets tolerantes a fallos, capaces de operar en paralelo (esta es la razón por la que son uno de los pilares base de Spark, ya que Spark, se basa principalmente en procesos paralelizados)."
Mil gracias.
Las transformaciones no se ejecutan hasta que se llama a una acción. Por ejemplo: ordenar el RDD (RDD.orderBy()) no se ejecutara hasta que se mande una acción en este caso RDD.orderBy().show().
resilient distributed dataset (RDD)
Son colecciones de datos distribuidos.
por ejemplo podemos usar la analogía de un .rar dividido en 10 partes
parte01.rar
parte02.rar
...
parte09.rar
parte10.rar
y Spark al ser distribuido, cada trozo es enviado a ser procesado de manera independiente, lueggo de ello los resultados son juntados.
a un alto nivel se puede decir que esta analogía es un RDD.
o decir que un dataser de 1000 registros es particionado en N particiones y cada subproceso en diferentes nodos ejecuta una porción
Son las principales estructuras de Spark y apartir de ellas se pueden construir todos los componentes que necesitemos. Los RDD son el componente mínimo con el cual podemos comunicarnos con Spark.
Características de los RDD
Principal abstracción de datos: Son la unidad básica de Spark.
Distribución: Se distribuyen y particionan a lo largo de nuestro clúster de máquinas.
Creación simple: No poseen una estructura definida y adoptan la más intuitiva.
Inmutabilidad: Una vez creadas no se pueden modificar.
Ejecución perezosa: A menos que se realice una acción.
DataFrame
Son una capa superior a los RDDs.
Formato: Poseen columnas, lo cual les otorga tipos de datos.
Optimización: Poseen una mejor implementación, lo cual los hace preferibles por su velocidad en operaciones.
Facilidad de creación: Se pueden crear desde una base de datos externa, archivo o RDD existente.
¿Cuándo usar RDD?
Es un dato "primitivo" de Spark y nos permite controlar su flujo.
Convertir RDDs a un conjunto de datos de Python nos permite mejor control, como si fueran datos nativos de Python.
Compatibilidad con versiones antiguas de Spark.
¿Cuándo usar DataFrames?
Si tenemos una instrucción muy complicada.
Vamos a realizar tareas de alto nivel como filtros, mapeos, agregaciones, promedios o sumas.
Si vamos a usar sentencias SQL-like.
, Ejecución perezosa (si existe algún error no lo validara hasta que ejecute una acción)
transformaciones: orderBy, groupBy, filter, select, join
acciones show, take, count, collect, save
DataFrame
Poseen estructura (nombre, tipo dato), mas rápidos y flexibles de crear.
Cuando usar RDD?
puedo contralar el flujo, Versiones antiguas de Spark :-D
Cuando usar DataFrames?
Operaciones complicadas, se puede trabajar como tablas y ejecutar sentencias como una base de datos tradicional
RDD (Resilient Distributed Datasets) traduce (Conjuntos de datos distribuidos resistentes) ...
A que se refiere con "Controlar los flujos" de RDDs?
Los RDD tienen el tipo de dato row, cuando necesitamos realizar operaciones en los RDD debemos aplicar transformaciones y acciones determinadas para llegar a un resultado buscado, vaya quizá formatear un texto o datos numéricos, spark su especialidad es manejar grandes volúmenes de datos, por lo que si necesitamos algo en concreto podemos ahorrarnos computo y tiempo que se utilizaría si importamos la data como un dataframe ya que al hacer esto internamente Scala realizara operaciones sobre la información para presentarla de la manera que Spark crea mas conveniente.
Espero haberme dado a entender sin redundar
RDDs y DataFrames
Son las principales estructuras en spark
RDD (Relational Distributed Datasets)
Son el componente mínimo con el cual podemos comunicarnos con Spark (Es como el lenguaje spark)
Son la principal abstraccion de datos
Distribucion → Se distribuyen a lo largo del cluster
Creación simple → No tienen estructura formalmente
Inmutabilidad → Posterior a su creacion no se pueden modificar
Ejecución perezosa (Lazy execution) → No hay ejecucion a menos que haya accion
Acciones vs Transformaciones!
DataFrames
Son una capa superior que existe sobre un RDD
Formato → Poseen columnas con tipo de dato
Optimización → Poseen una mejor implementación
Son más flexibles de crear
Cuando usar cada uno?
RDDs → Cuando se quiera controlar el flujo, Cuando se trabaje en pyspark o te conectas a versiones antiguas de spark
DataFrames → Semanticas / Operaciones complejas, Tareas de alto nivel (filtro, promedio, map, agregaciones), sentencias SQL
Conclusión: RDDs son distribuidos, inmutables y perezosos. DataFrames son estructurados
Les comparto mi articulo acerca de este tema, espero les sirva
Entiendo que los RDD sean inmutables, al estilo de las tuplas, pero con pandas siempre he podido modificar los DataFrames, porque dice que también son inmutables?
Los Dataframes de pandas no son lo mismo que los Dataframes de Spark, son cosas distintas, solo se llaman igual y parecen igual en estructura visual, pero en el transfondo son distintos, los de spark se respaldan con la estrutura de los RDD´s por lo que heredan ciertas caracteristicas.
exacto, como nos dice Efren. no es lo mismo Pandas y Spark, por casualidades comparten el nombre Dataframe.
Spark está orientado a programación funcional. hay un muy buen curso en Platzi sobre este tema donde se aprende el concepto de inmutabilidad