El Data Preprocessing en Apache Pig es una etapa fundamental para limpiar, transformar y estructurar datos antes de realizar análisis más avanzados. Apache Pig, con su lenguaje de alto nivel llamado Pig Latin, facilita estas tareas con operaciones optimizadas para manejar grandes volúmenes de datos en clústeres de Hadoop.
Data Preprocessing se refiere a las operaciones necesarias para preparar los datos crudos (raw data) para análisis. Esto incluye:
En Apache Pig, estas tareas se realizan mediante una serie de comandos Pig Latin, que se compilan en tareas MapReduce para ejecutarse en un clúster Hadoop.
1. Procesamiento distribuido: Permite manejar datos masivos en paralelo en un clúster.
2. Simplicidad: Pig Latin tiene una sintaxis declarativa más fácil de usar que escribir tareas MapReduce manualmente.
3. Flexibilidad: Compatible con datos estructurados, semiestructurados y no estructurados.
4. Compatibilidad: Trabaja con múltiples formatos de datos como CSV, JSON, Avro y Parquet.
El primer paso es cargar datos en Pig desde HDFS o sistemas locales.
-- Cargar datos desde un archivo CSV
data = LOAD 'hdfs://path/to/data.csv'
USING PigStorage(',')
AS (id: INT, nombre: CHARARRAY, edad: INT, salario: FLOAT);
El filtrado elimina registros irrelevantes o no válidos.
-- Filtrar usuarios mayores de 30 años
filtered_data = FILTER data BY edad > 30;
Usa el comando DISTINCT
para eliminar registros duplicados.
-- Eliminar duplicados en los datos
distinct_data = DISTINCT data;
Puedes transformar los datos con expresiones o funciones personalizadas.
-- Incrementar el salario en un 10%
transformed_data = FOREACH data GENERATE id, nombre, edad, salario * 1.1 AS nuevo_salario;
Agrupar datos es útil para calcular métricas como promedios, sumas o conteos.
-- Agrupar por edad
grouped_data = GROUP data BY edad;
-- Calcular salario promedio por edad
average_salary = FOREACH grouped_data GENERATE
group AS edad,
AVG(data.salario) AS salario_promedio;
Ordena los datos con el comando ORDER
.
-- Ordenar por salario en orden descendente
ordered_data = ORDER data BY salario DESC;
Reemplaza valores faltantes o elimina registros con valores nulos.
-- Filtrar registros con valores nulos en el campo 'nombre'
clean_data = FILTER data BY nombre IS NOT NULL;
-- Reemplazar valores nulos en 'salario' con un valor predeterminado
filled_data = FOREACH data GENERATE
id,
nombre,
edad,
(salario IS NOT NULL ? salario : 0.0) AS salario_limpio;
Une o combina datos de diferentes fuentes.
-- Dataset 1: Detalles de empleados
empleados = LOAD 'empleados.csv' USING PigStorage(',') AS (id: INT, nombre: CHARARRAY);
-- Dataset 2: Detalles de salarios
salarios = LOAD 'salarios.csv' USING PigStorage(',') AS (id: INT, salario: FLOAT);
-- Unir datos por el campo 'id'
joined_data = JOIN empleados BY id, salarios BY id;
-- Cargar datos
empleados = LOAD 'hdfs://path/to/empleados.csv' USING PigStorage(',') AS (id: INT, nombre: CHARARRAY, edad: INT, salario: FLOAT);
-- Filtrar empleados con salario mayor a 5000
filtered_empleados = FILTER empleados BY salario > 5000;
-- Incrementar el salario en un 5%
updated_salarios = FOREACH filtered_empleados GENERATE id, nombre, edad, salario * 1.05 AS salario_actualizado;
-- Agrupar por rango de edad
grouped_by_edad = GROUP updated_salarios BY (edad / 10) * 10;
-- Calcular salario promedio por rango de edad
average_salaries = FOREACH grouped_by_edad GENERATE
group AS rango_edad,
AVG(updated_salarios.salario_actualizado) AS salario_promedio;
-- Guardar el resultado
STORE average_salaries INTO 'hdfs://path/to/output' USING PigStorage(',');
Jorge García
Fullstack developer