Entradas

Mostrando entradas de mayo, 2025

Cómo convertir múltiples formatos de fecha en Apache Spark con Java y evitar errores comunes

 Cuando trabajamos con Dataset<Row> en Apache Spark, un desafío común es el formato inconsistente de fechas . Algunas columnas pueden traer la fecha como "1987-12-05" , otras como "2007-06-15 00:00:00 +0100 +01:00" , y algunas incluso como texto plano. Este problema puede causar errores de parseo y valores null inesperados. En este artículo te mostraré cómo resolver esto de forma robusta y escalable con Java, renombrando columnas, manejando múltiples formatos y evitando valores nulos. 🎯 Objetivo Queremos transformar varias columnas de un Dataset<Row> que contienen fechas en diferentes formatos, para: Renombrar las columnas con nombres estándar. Convertir el contenido a tipo Date si es necesario. Agregar una columna formateada en estilo dd/MM/yy para persistencia o exportación. 📦 ¿Por qué puede fallar el parseo? Spark utiliza to_date() con un patrón de formato específico. Si le pasas un valor que no se ajusta exactamente, te dev...

Cómo parsear archivos CSV procesamiento de archivos

 el procesamiento de archivos CSV en Spark, especialmente cuando las comas dentro de comillas deben ser respetadas. Ambos métodos funcionan bien, pero tienen diferencias clave: 1. Usando UserDefinedFunction (UDF) Este enfoque utiliza una función definida por el usuario (UDF) para procesar la cadena, hacer el split y devolver un array de strings. El UDF garantiza que las comas dentro de comillas se respeten. Es una solución más flexible, ya que puedes definir tu propia lógica de transformación. Pros: Flexibilidad: Permite una transformación personalizada de las columnas. Fácil de aplicar a un Dataset: Se aplica directamente sobre una columna. Optimización de Spark: Puedes aprovechar las optimizaciones que realiza Spark para aplicar el UDF en paralelo. Ejemplo: import org.apache.spark.sql.*; import org.apache.spark.sql.functions; import org.apache.spark.sql.expressions.UserDefinedFunction; import org.apache.spark.sql.types.*; import java.util.regex.Pattern; import java.util.regex.Mat...

Separacion de archivos csv por comas

Aquí tienes un ejemplo completo con datos de prueba: java import org . apache . spark . sql . * ; import org . apache . spark . sql . types . * ; import java . util . Arrays ; import java . util . List ; import static org . apache . spark . sql . functions . * ; public class SparkCSVParserExample { public static void main ( String [ ] args ) { // Crear la sesión de Spark SparkSession spark = SparkSession . builder ( ) . appName ( "CSVParserExample" ) . master ( "local[*]" ) . getOrCreate ( ) ; // Crear datos de ejemplo donde cada fila es una cadena CSV completa List < String > rawDataList = Arrays . asList ( "id,nombre,direccion,edad" , "101,\"Juan, Pérez\",\"Calle Principal, #45, Ciudad\",30" , "102,\"María Rodríguez\",\"Av. Central #123\",25...

Procesamiento de de cadena

Procesamiento de cadena  // 1. Leer el archivo como texto plano Dataset<Row> rawData = spark.read().text("ruta/al/archivo.csv"); // 2. Extraer la primera línea como encabezado String headerLine = rawData.first().getString(0); String[] columnNames = headerLine.split(","); // 3. Filtrar el encabezado Dataset<Row> dataWithoutHeader = rawData.filter(row -> !row.getString(0).equals(headerLine)); // 4. Procesar las líneas con un parser CSV adecuado Dataset<Row> processedData = dataWithoutHeader.map(row -> {     String line = row.getString(0);     CSVParser parser = new CSVParserBuilder()         .withSeparator(',')         .withQuoteChar('"')         .withIgnoreQuotations(false)         .build();          String[] values = parser.parseLine(line);     return RowFactory.create((Object[]) values); }, Encoders.bean(Row.class)); // 5. A...

Cómo Validar la Calidad de Datos en Spark: Guía Práctica

 Cómo Validar la Calidad de Datos en Spark: Guía Práctica En el mundo del Big Data, garantizar la calidad de nuestros datos es tan importante como procesarlos. Hoy te mostraré una técnica efectiva para validar DataFrames en Spark que implementé recientemente en un proyecto real. El Problema Cuando trabajamos con pipelines de datos, es común encontrarnos con: Datasets vacíos o mal formados Columnas faltantes que son críticas para nuestro análisis Filas completamente vacías o con valores nulos en campos importantes public static Optional<String> processColumns(Dataset<Row> df, SparkSession spark, String outputPath) {     if (df == null || df.columns().length == 0) {         return Optional.of("El dataset está vacío o no tiene columnas.");     }     List<String> expectedColumns = Arrays.asList(             "usuario"     );     Set<String> actualColumnSet = new Ha...