Introducción a Spark SQL

  1. Visión General de Spark SQL

Spark SQL es el módulo de Spark diseñado para el procesamiento de datos estructurados. Proporciona una interfaz unificada para procesar datos tanto en Spark RDDs como en fuentes de datos estructuradas como Hive, Parquet, JSON, etc.

  1. Evolución de Hive y Spark SQL

Spark SQL tiene sus raíces en Shark, un proyecto que proporcionaba una solución rápida para técnicos familiarizados con RDBMS pero no con MapReduce. Hive fue inicialmente la única herramienta SQL-on-Hadoop que funcionaba en Hadoop. Sin embargo, el proceso de cálculo de MapReduce que involucraba numerosas operaciones de escritura intermedia en disco consumía gran cantidad de I/O, reduciendo la eficiencia.

Para mejorar la eficiencia de SQL-on-Hadoop, surgieron varias herramientas:

  • Drill
  • Impala
  • Shark

Shark era uno de los componentes del ecosistema Spark del laboratorio de Berkeley, desarrollado sobre Hive. Modificó los módulos de gestión de memoria, plan físico y ejecución para que pudirean funcionar en el motor Spark.

La aparición de Shark mejoró el rendimiento de SQL-on-Hadoop en un factor de 10-100 veces en comparación con Hive.

Con el desarrollo de Spark, el ambicioso equipo de Spark consideró que la dependencia excesiva de Shark con Hive (como su analizador sintáctico, optimizador de consultas, etc.) limitaba la política de "One Stack Rule Them All" de Spark y la integración de sus componentes. Por esta razón, se propuso el proyecto Spark SQL.

Spark SQL descartó el código original de Shark, pero incorporó algunas de sus ventajas, como el almacenamiento en memoria de columnas y la compatibilidad con Hive. Al eliminar la dependencia de Hive, Spark SQL facilitó enormemente la compatibilidad de datos, la optimización del rendimiento y la extensión de componentes:

  • Compatibilidad de datos: Spark SQL no solo es compatible con Hive, sino que también puede obtener datos de RDD, archivos Parquet, archivos JSON, y en versiones futuras incluso soportará bases de datos relacionales y sistemas NoSQL como Cassandra.
  • Optimización del rendimiento: Además de técnicas como el almacenamiento en memoria de columnas y generación de código byte-code, introdujo un modelo de costo para evaluar dinámicamente las consultas y obtener el plan físico óptimo.
  • Extensión de componentes: El analizador sintáctico, el analizador y el optimizador de SQL pueden redefinirse y extenderse.

El 1 de junio de 2014, Reynold Xin, líder de los proyectos Shark y Spark SQL, anunció el cese del desarrollo de Shark, dirigiendo todos los recursos al proyecto Spark SQL. Esto marcó el fin de Shark pero dio lugar a dos ramas: Spark SQL y Hive on Spark.

Spark SQL continúa como parte del ecosistema Spark, ya no limitado por Hive aunque mantiene la compatibilidad. Por otro lado, Hive on Spark es un plan de desarrollo de Hive que utiliza Spark como uno de sus motores subyacentes, permitiendo a Hive funcionar con motores como Map-Reduce, Tez y Spark.

Para los desarrolladores, Spark SQL simplifica el desarrollo de RDD y mejora la eficiencia, por lo que es la opción preferida en la práctica. Spark SQL proporciona dos abstracciones de programación similares a RDD en Spark Core: DataFrame y DataSet.

  1. Características de Spark SQL

  1. Fácil integración: Combina sin problemas consultas SQL y programación Spark.

// Ejemplo modificado
sparkSession = SparkSession.builder.appName("EjemploSparkSQL").getOrCreate()
resultado = sparkSession.sql("SELECT nombre FROM personas")
nombres = resultado.map(lambda fila: fila.nombre)
           
  1. Acceso unificado a datos: Utiliza el mismo método para conectarse a diferentes fuentes de datos.

// Ejemplo modificado
datosJSON = sparkSession.read.json("s3://ruta/datos.json")
datosJSON.createOrReplaceTempView("tablaJSON")
resultado = sparkSession.sql("""SELECT * 
                                FROM personas 
                                JOIN tablaJSON ...""")
           
  1. Compatibilidad con Hive: Permite ejecutar SQL o HQL directamente en almacenes de datos existentes.

  2. Conexión estándar de datos: Soporta conexiones mediante JDBC u ODBC.

  3. DataFrame


En Spark, un DataFrame es un conjunto de datos distribuido basado en RDD, similar a una tabla bidimensional de una base de datos tradicional. La principal diferencia entre DataFrame y RDD es que el primero incluye metadatos de esquema, es decir, cada columna del DataFrame tiene un nombre y un tipo.

Esto permite que Spark SQL comprenda mejor la estructura de los datos y realice optimizaciones específicas en las transformaciones aplicadas al DataFrame, mejorando significativamente la eficiencia. Por el contrario, RDD alberga datos cuyas estrucutras internas no son conocidas por el framework, lo que limita las optimizaciones a un nivel genérico de etapas.

Al igual que Hive, DataFrame soporta tipos de datos anidados (struct, array y map). Desde el punto de vista de la API, DataFrame ofrece un conjunto de operaciones relacionales de alto nivel, más amigables y con menor barrera de entrada que la API funcional de RDD.

El RDD[Persona] de la izquierda utiliza Persona como parámetro de tipo, pero el framework Spark no conoce su estructura interna. En cambio, el DataFrame de la derecha proporciona información detallada sobre la estructura, permitiendo a Spark SQL saber qué columnas contiene y sus tipos. DataFrame es una vista con esquema de los datos, similar a una tabla en una base de datos. También ejecuta de manera perezosa pero con mayor rendimiento que RDD.

La razón principal es el plan de ejecución optimizado, donde el plan de consulta es optimizado mediante el optimizador Catalyst de Spark.

  1. DataSet

DataSet es una colección de datos distribuidos. Fue agregado en Spark 1.6 como una nueva abstracción, siendo una extensión de DataFrame. Combina las ventajas de RDD (tipos fuertes, capacidad de usar funciones lambda potentes) con los beneficios del motor de ejecución optimizado de Spark SQL. DataSet también puede utilizar transformaciones funcionales (map, flatMap, filter, etc.).

  1. DataSet es una extensión de la API DataFrame, siendo la abstracción de datos más reciente de SparkSQL.
  2. Ofrece un estilo de API amigable para el usuario, con verificación de tipos segura y características de optimización de consultas de DataFrame.
  3. Utiliza clases de ejemplo para definir la información estructural de los datos en DataSet, donde cada atributo de la clase se mapea directamente a un campo en el DataSet.
  4. DataSet es de tipo fuerte. Por ejemplo, puede tener DataSet[Coche], DataSet[Persona].
  5. DataFrame es un caso especial de DataSet, donde DataFrame = DataSet[Fila]. Por lo tanto, se puede convertir un DataFrame a DataSet mediante el método as. Fila es un tipo, similar a Coche o Persona, y toda la información estructural de la tabla se representa con Fila. Al recuperar los datos, es necesario especificar el orden.

Etiquetas: spark-sql dataframe dataset big-data apache-spark

Publicado el 7-2 22:40