Introducción a Apache Pig

Apache Pig es una plataforma de alto nivel para crear programas que se ejecutan en el framework Hadoop. La principal característica de Pig es su lenguaje de scripts, Pig Latin, que permite a los desarrolladores escribir complejos trabajos de procesamiento de datos de manera más sencilla y concisa que con MapReduce.

Características Clave de Apache Pig

  • Lenguaje de Alto Nivel: Pig Latin es más fácil de escribir y entender que el código MapReduce.
  • Extensibilidad: Permite a los usuarios definir sus propias funciones (UDFs) para tareas específicas.
  • Optimización Automática: Pig optimiza automáticamente las tareas de procesamiento de datos.
  • Interoperabilidad: Se integra bien con otras herramientas del ecosistema Hadoop como HDFS, HBase y Hive.

Instalación y Configuración de Apache Pig

Requisitos Previos

  • Java JDK 1.8 o superior
  • Hadoop instalado y configurado

Pasos de Instalación

  1. Descargar Apache Pig:

    wget https://downloads.apache.org/pig/pig-0.17.0/pig-0.17.0.tar.gz
    
  2. Extraer el Archivo:

    tar -xzvf pig-0.17.0.tar.gz
    
  3. Configurar Variables de Entorno: Añade las siguientes líneas a tu archivo .bashrc o .bash_profile:

    export PIG_HOME=/path/to/pig-0.17.0
    export PATH=$PATH:$PIG_HOME/bin
    
  4. Verificar la Instalación:

    pig -version
    

Conceptos Básicos de Pig Latin

Estructura de un Script Pig Latin

Un script Pig Latin generalmente sigue estos pasos:

  1. Carga de Datos:

    data = LOAD 'input_data.txt' USING PigStorage(',') AS (field1:chararray, field2:int, field3:float);
    
  2. Transformación de Datos:

    filtered_data = FILTER data BY field2 > 10;
    grouped_data = GROUP filtered_data BY field1;
    
  3. Almacenamiento de Resultados:

    STORE grouped_data INTO 'output_data' USING PigStorage(',');
    

Ejemplo Práctico

Supongamos que tenemos un archivo students.txt con el siguiente contenido:

John,20,85.5
Jane,22,90.0
Doe,21,75.0

Queremos filtrar los estudiantes con una edad mayor a 20 y agruparlos por nombre.

Script Pig Latin

-- Cargar los datos
students = LOAD 'students.txt' USING PigStorage(',') AS (name:chararray, age:int, score:float);

-- Filtrar los estudiantes con edad mayor a 20
filtered_students = FILTER students BY age > 20;

-- Agrupar los estudiantes por nombre
grouped_students = GROUP filtered_students BY name;

-- Almacenar los resultados
STORE grouped_students INTO 'output_students' USING PigStorage(',');

Ejecución del Script

Guarda el script en un archivo llamado student_filter.pig y ejecútalo usando el comando:

pig student_filter.pig

Funciones Definidas por el Usuario (UDFs)

Creación de una UDF en Java

Las UDFs permiten a los usuarios extender la funcionalidad de Pig Latin. Aquí hay un ejemplo de una UDF que convierte una cadena a mayúsculas.

Código Java para la UDF

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import java.io.IOException;

public class ToUpperCase extends EvalFunc<String> {
    public String exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0)
            return null;
        try {
            String str = (String) input.get(0);
            return str.toUpperCase();
        } catch (Exception e) {
            throw new IOException("Caught exception processing input row ", e);
        }
    }
}

Uso de la UDF en un Script Pig Latin

  1. Compilar la UDF:

    javac -cp pig-0.17.0.jar ToUpperCase.java
    jar -cf to_upper_case.jar ToUpperCase.class
    
  2. Registrar y Usar la UDF:

    REGISTER 'to_upper_case.jar';
    DEFINE ToUpperCase ToUpperCase();
    
    students = LOAD 'students.txt' USING PigStorage(',') AS (name:chararray, age:int, score:float);
    upper_case_students = FOREACH students GENERATE ToUpperCase(name), age, score;
    STORE upper_case_students INTO 'output_upper_case_students' USING PigStorage(',');
    

Ejercicios Prácticos

Ejercicio 1: Filtrado y Agrupación

Objetivo: Filtrar los registros de un archivo de datos y agruparlos por una columna específica.

Archivo de Entrada: sales.txt

product1,100,2023-01-01
product2,200,2023-01-02
product1,150,2023-01-03
product3,300,2023-01-04

Requerimiento: Filtrar las ventas mayores a 150 y agruparlas por producto.

Script Pig Latin:

sales = LOAD 'sales.txt' USING PigStorage(',') AS (product:chararray, amount:int, date:chararray);
filtered_sales = FILTER sales BY amount > 150;
grouped_sales = GROUP filtered_sales BY product;
STORE grouped_sales INTO 'output_sales' USING PigStorage(',');

Ejercicio 2: Uso de UDF

Objetivo: Crear una UDF que convierta las fechas a un formato específico y usarla en un script Pig Latin.

Archivo de Entrada: events.txt

event1,2023-01-01
event2,2023-01-02
event3,2023-01-03

Requerimiento: Convertir las fechas al formato dd-MM-yyyy.

Código Java para la UDF:

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FormatDate extends EvalFunc<String> {
    public String exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0)
            return null;
        try {
            String dateStr = (String) input.get(0);
            SimpleDateFormat fromFormat = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat toFormat = new SimpleDateFormat("dd-MM-yyyy");
            Date date = fromFormat.parse(dateStr);
            return toFormat.format(date);
        } catch (Exception e) {
            throw new IOException("Caught exception processing input row ", e);
        }
    }
}

Script Pig Latin:

REGISTER 'format_date.jar';
DEFINE FormatDate FormatDate();

events = LOAD 'events.txt' USING PigStorage(',') AS (event:chararray, date:chararray);
formatted_events = FOREACH events GENERATE event, FormatDate(date);
STORE formatted_events INTO 'output_events' USING PigStorage(',');

Conclusión

En esta sección, hemos explorado Apache Pig, una herramienta poderosa para el procesamiento de datos en Hadoop. Hemos aprendido a instalar y configurar Pig, escribir scripts en Pig Latin, y extender su funcionalidad mediante UDFs. Con estos conocimientos, puedes manejar grandes volúmenes de datos de manera eficiente y efectiva.

En el próximo módulo, profundizaremos en Apache Hive, otra herramienta esencial del ecosistema Hadoop que facilita el análisis de datos a través de consultas SQL.

© Copyright 2024. Todos los derechos reservados