En este módulo, aprenderemos a trabajar con Datasets en Apache Spark. Los Datasets son una extensión de los DataFrames y proporcionan una API de alto nivel para trabajar con datos estructurados. Los Datasets combinan las ventajas de RDDs y DataFrames, ofreciendo una API tipada y optimizaciones de ejecución.
Contenido
- ¿Qué es un Dataset?
- Creación de Datasets
- Operaciones Básicas con Datasets
- Transformaciones y Acciones en Datasets
- Ejemplos Prácticos
- Ejercicios Prácticos
- ¿Qué es un Dataset?
Un Dataset es una colección distribuida de datos que proporciona las ventajas de los RDDs (tipado fuerte y optimizaciones de ejecución) y los DataFrames (API de alto nivel y optimizaciones de consulta). Los Datasets permiten trabajar con datos estructurados de manera eficiente y segura.
Características Clave de los Datasets:
- Tipado Fuerte: Los Datasets son tipados, lo que significa que el compilador puede verificar los tipos de datos en tiempo de compilación.
- Optimización: Los Datasets se benefician de las optimizaciones de Catalyst y Tungsten, lo que mejora el rendimiento de las consultas.
- API de Alto Nivel: Proporcionan una API de alto nivel similar a los DataFrames, lo que facilita la manipulación de datos.
- Creación de Datasets
Para crear un Dataset, primero necesitamos definir una clase de caso (case class) que represente el esquema de nuestros datos. Luego, podemos crear un Dataset a partir de una colección o de un DataFrame.
Ejemplo de Creación de un Dataset:
// Definimos una clase de caso case class Person(name: String, age: Int) // Creamos una lista de personas val people = Seq(Person("Alice", 29), Person("Bob", 35), Person("Cathy", 23)) // Convertimos la lista a un Dataset val peopleDS = spark.createDataset(people) // Mostramos el contenido del Dataset peopleDS.show()
Explicación del Código:
- Definición de la Clase de Caso: Definimos una clase de caso
Person
con dos campos:name
yage
. - Creación de una Lista: Creamos una lista de objetos
Person
. - Conversión a Dataset: Utilizamos el método
createDataset
de Spark para convertir la lista en un Dataset. - Mostrar el Dataset: Utilizamos el método
show
para mostrar el contenido del Dataset.
- Operaciones Básicas con Datasets
Los Datasets soportan una variedad de operaciones, incluyendo selección, filtrado, agregación y ordenación.
Ejemplo de Operaciones Básicas:
// Selección de columnas val namesDS = peopleDS.select("name") // Filtrado de datos val adultsDS = peopleDS.filter(person => person.age >= 18) // Agregación de datos val averageAge = peopleDS.groupBy().avg("age") // Ordenación de datos val sortedDS = peopleDS.orderBy("age")
Explicación del Código:
- Selección de Columnas: Utilizamos el método
select
para seleccionar la columnaname
. - Filtrado de Datos: Utilizamos el método
filter
para filtrar las personas mayores de 18 años. - Agregación de Datos: Utilizamos el método
groupBy
yavg
para calcular la edad promedio. - Ordenación de Datos: Utilizamos el método
orderBy
para ordenar las personas por edad.
- Transformaciones y Acciones en Datasets
Las transformaciones y acciones en Datasets son similares a las de RDDs y DataFrames. Las transformaciones son operaciones perezosas que devuelven un nuevo Dataset, mientras que las acciones son operaciones que devuelven un valor o escriben datos.
Ejemplo de Transformaciones y Acciones:
// Transformación: map val namesUpperCaseDS = peopleDS.map(person => person.name.toUpperCase) // Acción: collect val namesArray = namesUpperCaseDS.collect() // Transformación: filter val youngPeopleDS = peopleDS.filter(person => person.age < 30) // Acción: count val countYoungPeople = youngPeopleDS.count()
Explicación del Código:
- Transformación
map
: Utilizamos el métodomap
para convertir los nombres a mayúsculas. - Acción
collect
: Utilizamos el métodocollect
para recolectar los datos en un array. - Transformación
filter
: Utilizamos el métodofilter
para filtrar las personas menores de 30 años. - Acción
count
: Utilizamos el métodocount
para contar el número de personas jóvenes.
- Ejemplos Prácticos
Ejemplo 1: Cálculo de la Edad Promedio
// Definimos una clase de caso case class Person(name: String, age: Int) // Creamos una lista de personas val people = Seq(Person("Alice", 29), Person("Bob", 35), Person("Cathy", 23)) // Convertimos la lista a un Dataset val peopleDS = spark.createDataset(people) // Calculamos la edad promedio val averageAge = peopleDS.groupBy().avg("age").first().getDouble(0) println(s"Edad promedio: $averageAge")
Ejemplo 2: Filtrado y Ordenación
// Definimos una clase de caso case class Person(name: String, age: Int) // Creamos una lista de personas val people = Seq(Person("Alice", 29), Person("Bob", 35), Person("Cathy", 23)) // Convertimos la lista a un Dataset val peopleDS = spark.createDataset(people) // Filtramos las personas mayores de 25 años y las ordenamos por edad val filteredSortedDS = peopleDS.filter(person => person.age > 25).orderBy("age") filteredSortedDS.show()
- Ejercicios Prácticos
Ejercicio 1: Creación y Manipulación de Datasets
Instrucciones:
- Define una clase de caso
Employee
con los camposname
(String) ysalary
(Double). - Crea una lista de empleados.
- Convierte la lista en un Dataset.
- Filtra los empleados con un salario mayor a 50000.
- Calcula el salario promedio de los empleados filtrados.
Solución:
// Paso 1: Definición de la clase de caso case class Employee(name: String, salary: Double) // Paso 2: Creación de una lista de empleados val employees = Seq(Employee("John", 60000), Employee("Jane", 45000), Employee("Sam", 70000)) // Paso 3: Conversión a Dataset val employeesDS = spark.createDataset(employees) // Paso 4: Filtrado de empleados con salario mayor a 50000 val highSalaryDS = employeesDS.filter(employee => employee.salary > 50000) // Paso 5: Cálculo del salario promedio val averageSalary = highSalaryDS.groupBy().avg("salary").first().getDouble(0) println(s"Salario promedio: $averageSalary")
Ejercicio 2: Transformaciones y Acciones
Instrucciones:
- Define una clase de caso
Product
con los camposname
(String) yprice
(Double). - Crea una lista de productos.
- Convierte la lista en un Dataset.
- Aplica una transformación para incrementar el precio de cada producto en un 10%.
- Recolecta los datos transformados en un array y muéstralos.
Solución:
// Paso 1: Definición de la clase de caso case class Product(name: String, price: Double) // Paso 2: Creación de una lista de productos val products = Seq(Product("Laptop", 1000), Product("Phone", 500), Product("Tablet", 300)) // Paso 3: Conversión a Dataset val productsDS = spark.createDataset(products) // Paso 4: Transformación para incrementar el precio en un 10% val increasedPriceDS = productsDS.map(product => Product(product.name, product.price * 1.10)) // Paso 5: Recolección y muestra de los datos transformados val productsArray = increasedPriceDS.collect() productsArray.foreach(product => println(s"${product.name}: ${product.price}"))
Conclusión
En esta sección, hemos aprendido a trabajar con Datasets en Apache Spark. Hemos cubierto la creación de Datasets, operaciones básicas, transformaciones y acciones, y hemos visto ejemplos prácticos y ejercicios para reforzar los conceptos. Los Datasets combinan las ventajas de los RDDs y DataFrames, proporcionando una API tipada y optimizaciones de ejecución, lo que los hace una herramienta poderosa para el procesamiento de datos estructurados.
En el próximo módulo, profundizaremos en el manejo de datos faltantes y cómo tratarlos eficientemente en Spark.
Curso de Apache Spark
Módulo 1: Introducción a Apache Spark
Módulo 2: Conceptos Básicos de Spark
- RDDs (Conjuntos de Datos Distribuidos Resilientes)
- Transformaciones y Acciones
- DataFrames de Spark
- Spark SQL
Módulo 3: Procesamiento de Datos con Spark
Módulo 4: Programación Avanzada en Spark
Módulo 5: Ajuste y Optimización del Rendimiento
- Entendiendo los Trabajos de Spark
- Caché y Persistencia
- Gestión de Memoria
- Optimizando Aplicaciones Spark
Módulo 6: Spark en la Nube
- Ejecutando Spark en AWS
- Ejecutando Spark en Azure
- Ejecutando Spark en Google Cloud
- Spark con Kubernetes
Módulo 7: Aplicaciones del Mundo Real y Estudios de Caso
- Procesamiento de Datos en Tiempo Real
- Analítica de Big Data
- Pipelines de Aprendizaje Automático
- Estudios de Caso