En el procesamiento de datos, es común encontrarse con datos faltantes. Apache Spark proporciona varias herramientas y técnicas para manejar estos datos de manera eficiente. En esta sección, aprenderemos cómo identificar, manejar y procesar datos faltantes utilizando DataFrames y Datasets en Spark.

Objetivos de Aprendizaje

  • Comprender cómo identificar datos faltantes en un DataFrame.
  • Aprender diferentes técnicas para manejar datos faltantes.
  • Implementar estas técnicas en ejemplos prácticos.

Identificación de Datos Faltantes

Antes de manejar los datos faltantes, es crucial identificarlos. En Spark, los datos faltantes suelen representarse como null o NaN (Not a Number).

Ejemplo de Identificación de Datos Faltantes

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

val spark = SparkSession.builder.appName("Manejo de Datos Faltantes").getOrCreate()

// Crear un DataFrame de ejemplo
val data = Seq(
  (1, "Alice", 34, 2000.0),
  (2, "Bob", null, 1500.0),
  (3, "Cathy", 29, null),
  (4, null, 45, 3000.0)
)

val df = spark.createDataFrame(data).toDF("id", "name", "age", "salary")

// Mostrar el DataFrame
df.show()

// Identificar datos faltantes
df.select(df.columns.map(c => sum(col(c).isNull.cast("int")).alias(c)): _*).show()

Explicación del Código

  • Creación del DataFrame: Creamos un DataFrame con algunos valores null.
  • Identificación de Datos Faltantes: Utilizamos la función isNull para identificar los valores null en cada columna y sumamos estos valores para obtener el número total de datos faltantes por columna.

Técnicas para Manejar Datos Faltantes

  1. Eliminación de Filas o Columnas

Eliminación de Filas

// Eliminar filas con cualquier valor null
val dfNoNullRows = df.na.drop()
dfNoNullRows.show()

Eliminación de Columnas

// Eliminar columnas con cualquier valor null
val dfNoNullCols = df.drop("name")
dfNoNullCols.show()

  1. Imputación de Valores

Imputación con un Valor Específico

// Imputar valores null con un valor específico
val dfImputed = df.na.fill(Map("age" -> 0, "salary" -> 0.0))
dfImputed.show()

Imputación con la Media, Mediana o Moda

// Calcular la media de la columna "age"
val meanAge = df.select(mean("age")).first().getDouble(0)

// Imputar valores null en "age" con la media
val dfImputedMean = df.na.fill(Map("age" -> meanAge))
dfImputedMean.show()

  1. Uso de Modelos de Machine Learning para Imputación

Para imputaciones más avanzadas, se pueden utilizar modelos de machine learning. Sin embargo, esto está fuera del alcance de esta sección introductoria.

Ejercicio Práctico

Ejercicio 1: Identificación y Manejo de Datos Faltantes

Instrucciones

  1. Crea un DataFrame con datos faltantes.
  2. Identifica las columnas con datos faltantes.
  3. Elimina las filas con datos faltantes.
  4. Imputa los valores faltantes en una columna con la media de esa columna.

Solución

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

val spark = SparkSession.builder.appName("Ejercicio Manejo de Datos Faltantes").getOrCreate()

// Crear un DataFrame de ejemplo
val data = Seq(
  (1, "Alice", 34, 2000.0),
  (2, "Bob", null, 1500.0),
  (3, "Cathy", 29, null),
  (4, null, 45, 3000.0)
)

val df = spark.createDataFrame(data).toDF("id", "name", "age", "salary")

// Identificar datos faltantes
df.select(df.columns.map(c => sum(col(c).isNull.cast("int")).alias(c)): _*).show()

// Eliminar filas con cualquier valor null
val dfNoNullRows = df.na.drop()
dfNoNullRows.show()

// Calcular la media de la columna "age"
val meanAge = df.select(mean("age")).first().getDouble(0)

// Imputar valores null en "age" con la media
val dfImputedMean = df.na.fill(Map("age" -> meanAge))
dfImputedMean.show()

Conclusión

En esta sección, hemos aprendido cómo identificar y manejar datos faltantes en Apache Spark. Hemos explorado técnicas como la eliminación de filas o columnas, la imputación de valores específicos y la imputación con la media. Estas técnicas son fundamentales para preparar los datos antes de realizar análisis o construir modelos de machine learning.

En la siguiente sección, profundizaremos en la programación avanzada en Spark, comenzando con Spark Streaming.

© Copyright 2024. Todos los derechos reservados