En Spark SQL, existen dos formas principales de trabajar con datos estructurados: RDDs y DataFrames. Mientras que los RDDs representan el enfoque tradicional, los DataFrames son la abstracción de datos preferida en versiones más recientes de Spark.
RDDs (Resilient Distributed Datasets)
Los RDDs son colecciones de elementos distribuidos en los nodos de un clúster, sobre los cuales se pueden realizar operaciones en paralelo. Se caracterizan por:
- Dependencias: Describen cómo se construye un RDD a partir de sus entradas.
- Particiones: Permiten dividir el trabajo para paralelizar el cálculo.
- Función de cálculo: Genera un iterador para los datos del RDD.
Se pueden crear RDDs a partir de archivos de texto, colecciones de Python, etc. Las operaciones sobre RDDs se dividen en transformaciones y acciones:
- Transformaciones: Crean un nuevo RDD aplicando lógica a cada elemento del RDD existente. Son de evaluación perezosa, es decir, se agregan al DAG de cálculo y se ejecutan solo cuando se necesita el resultado.
- Ejemplos: map(), flatMap(), filter(), coalesce(), repartition(), reduceByKey().
- Acciones: Activan el cálculo del DAG de transformaciones. Se dividen en conductoras (devuelven datos al controlador) y distribuidas (se ejecutan en los nodos del clúster).
- Ejemplos: reduce(), count(), collect(), take(), max(), saveAsTextFile().
Aspectos avanzados del trabajo con RDDs incluyen el almacenamiento en caché (persist(), cache(), unpersist()), el particionado (HashPartitioner, RangePartitioner), el shuffling de datos y el uso de variables broadcast y acumuladores.
DataFrames
Introducidos en Spark 1.6, los DataFrames son la abstracción de datos preferida para la mayoría de los casos de uso. Se basan en el concepto de esquema, que define la estructura de los datos.
Se pueden crear DataFrames a partir de:
- RDDs.
- Fuentes de datos en diversos formatos: CSV, JSON, Parquet, ORC, etc.
Al igual que con los RDDs, las operaciones sobre DataFrames se dividen en transformaciones y acciones. La sintaxis para trabajar con DataFrames es más concisa y similar a SQL.
- Transformaciones: Ejemplos: select(), selectExpr(), filter(), where(), distinct(), dropDuplicates(), sort(), orderBy(), limit(), withColumn(), withColumnRenamed(), drop(), sample(), randomSplit().
- Acciones:Ejemplos: show(), count(), collect(), first(), take(), head().
Comparación entre RDDs y DataFrames en Spark
Característica | RDDs | DataFrames |
---|---|---|
Enfoque | Tradicional | Estructurado |
Esquema | No | Sí |
Optimización | Menor | Mayor (Catalyst Optimizer) |
Sintaxis | Más verbosa | Más concisa, similar a SQL |
Rendimiento | Generalmente menor | Generalmente mayor |
Ventajas de los DataFrames
Los DataFrames ofrecen ventajas significativas sobre los RDDs en términos de rendimiento y facilidad de uso:
- El Catalyst Optimizer optimiza automáticamente las operaciones sobre DataFrames, lo que resulta en una ejecución más rápida.
- La sintaxis similar a SQL hace que los DataFrames sean más intuitivos para trabajar con datos estructurados.
En general, los DataFrames son la opción preferida para trabajar con datos estructurados en Spark SQL. Los RDDs siguen siendo relevantes para casos de uso específicos, como:
- El trabajo con datos no estructurados.
- La manipulación de bajo nivel de particiones.
Spark SQL
Spark SQL es un módulo de Spark para trabajar con datos estructurados. Se basa en el concepto de DataFrames, que son colecciones de datos organizadas en columnas con nombre y tipos de datos definidos. Esto permite a Spark realizar optimizaciones significativas para un mejor rendimiento.
Catalyst Optimizer
El Catalyst Optimizer es un componente clave de Spark SQL. Su función es optimizar las operaciones sobre DataFrames para una ejecución más rápida. Lo hace traduciendo la lógica de procesamiento de datos en un plan lógico, optimizándolo y luego convirtiéndolo en un plan físico para la ejecución.