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

  1. ¿Qué es un Dataset?
  2. Creación de Datasets
  3. Operaciones Básicas con Datasets
  4. Transformaciones y Acciones en Datasets
  5. Ejemplos Prácticos
  6. Ejercicios Prácticos

  1. ¿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.

  1. 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:

  1. Definición de la Clase de Caso: Definimos una clase de caso Person con dos campos: name y age.
  2. Creación de una Lista: Creamos una lista de objetos Person.
  3. Conversión a Dataset: Utilizamos el método createDataset de Spark para convertir la lista en un Dataset.
  4. Mostrar el Dataset: Utilizamos el método show para mostrar el contenido del Dataset.

  1. 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:

  1. Selección de Columnas: Utilizamos el método select para seleccionar la columna name.
  2. Filtrado de Datos: Utilizamos el método filter para filtrar las personas mayores de 18 años.
  3. Agregación de Datos: Utilizamos el método groupBy y avg para calcular la edad promedio.
  4. Ordenación de Datos: Utilizamos el método orderBy para ordenar las personas por edad.

  1. 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:

  1. Transformación map: Utilizamos el método map para convertir los nombres a mayúsculas.
  2. Acción collect: Utilizamos el método collect para recolectar los datos en un array.
  3. Transformación filter: Utilizamos el método filter para filtrar las personas menores de 30 años.
  4. Acción count: Utilizamos el método count para contar el número de personas jóvenes.

  1. 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()

  1. Ejercicios Prácticos

Ejercicio 1: Creación y Manipulación de Datasets

Instrucciones:

  1. Define una clase de caso Employee con los campos name (String) y salary (Double).
  2. Crea una lista de empleados.
  3. Convierte la lista en un Dataset.
  4. Filtra los empleados con un salario mayor a 50000.
  5. 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:

  1. Define una clase de caso Product con los campos name (String) y price (Double).
  2. Crea una lista de productos.
  3. Convierte la lista en un Dataset.
  4. Aplica una transformación para incrementar el precio de cada producto en un 10%.
  5. 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.

© Copyright 2024. Todos los derechos reservados